gpt4 book ai didi

java - "infinite"迭代器的设计是否糟糕?

转载 作者:IT老高 更新时间:2023-10-28 13:52:12 26 4
gpt4 key购买 nike

提供“无限”的 Iterator 实现通常被认为是不好的做法吗?即对 hasNext() always(*) 的调用在哪里返回 true?

通常我会说"is",因为调用代码可能会出现异常行为,但在下面的实现中,hasNext() 将返回 true,除非调用者从列表中删除迭代器所在的所有元素初始化为;即有一个终止条件。你认为这是对 Iterator 的合法使用吗?尽管我想有人可能会说它不直观,但它似乎并没有违反契约(Contract)。

public class CyclicIterator<T> implements Iterator<T> {
private final List<T> l;
private Iterator<T> it;

public CyclicIterator<T>(List<T> l) {
this.l = l;
this.it = l.iterator();
}

public boolean hasNext() {
return !l.isEmpty();
}

public T next() {
T ret;

if (!hasNext()) {
throw new NoSuchElementException();
} else if (it.hasNext()) {
ret = it.next();
} else {
it = l.iterator();
ret = it.next();
}

return ret;
}

public void remove() {
it.remove();
}
}

(迂腐)编辑

有些人评论了如何使用 Iterator 从无界序列(如斐波那契序列)生成值。但是,Java Iterator 文档指出 Iterator 是:

An iterator over a collection.

现在你可以说斐波那契数列是一个无限集合,但在 Java 中我会将集合等同于 java.util.Collection 接口(interface),它提供了诸如 size() 暗示一个集合必须是有界的。因此,使用 Iterator 作为无界序列的值生成器是否合法?

最佳答案

我认为它完全合法 - Iterator 只是一个“东西”流。为什么流必须有界?

许多其他语言(例如 Scala)都内置了无限流的概念,并且可以对其进行迭代。例如,使用 scalaz

scala> val fibs = (0, 1).iterate[Stream](t2 => t2._2 -> (t2._1 + t2._2)).map(_._1).iterator
fibs: Iterator[Int] = non-empty iterator

scala> fibs.take(10).mkString(", ") //first 10 fibonnacci numbers
res0: String = 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

编辑: 就最小意外原则而言,我认为这完全取决于上下文。例如,我希望这个方法返回什么?

public Iterator<Integer> fibonacciSequence();

关于java - "infinite"迭代器的设计是否糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2622591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com