【发布时间】:2013-12-25 14:58:30
【问题描述】:
在不实现可迭代的情况下实现迭代器什么时候有用?
或者实现迭代器只是实现可迭代的副产品?
【问题讨论】:
在不实现可迭代的情况下实现迭代器什么时候有用?
或者实现迭代器只是实现可迭代的副产品?
【问题讨论】:
这两者是相关的,但并不相同。
List 是Iterable - 你可以得到它的Iterator。它不是Iterator。
Iterator 是一个一次性使用类,它可以使用 hasNext 和 next 方法沿对象的 Collection 进行迭代。
Iterable 是一个 Collection 类,当调用 iterator() 方法时返回一个 Iterator 实例。
我想说的是,我认为 没有 的情况是 Iterable 应该是 implements Iterator。由于Iterator 是一次性使用,我看不到Iterator 应该implements Iterable 的情况。
【讨论】:
List 具有扩展 Iterator 的 ListIterator。那么为什么“它不是Iterator”呢?
List 返回 Iterator,因为它是Iterable。它肯定不是Iterator - 那是ListIterator 的工作。
ResultSet。这是一个Iterator 模式,但它没有Iterable,它是查询的结果。
public interface ListIterator<E> extends Iterator<E>。为什么 ListIterator 不是迭代器?
它们在语义和用例上非常相似,但在实现上有所不同。 Iterable 是一个简单的迭代器工厂,可以在 for 循环中使用。因此,实现 Iterable 可能更方便。
for(String s : getIterable()){
...
}
对比:
Iterator<String> it = getIterator();
while(it.hasNext()){
String s = it.next();
...
}
但是,在某些情况下,Iterator 可能不会被重新实例化,即当您运行 db 请求结果时,因此在这种情况下,如果不重新发送您的请求,您将无法使其成为 Iterable。
【讨论】:
一般来说,您可以实现一个 Iterable 或一个 Iterator 来隐藏集合的实现,使代码对集合进行迭代。任何一个都可以很好地工作。不同之处在于集合可以遍历多少次。迭代器只能遍历集合一次,而 Iterable 可以多次遍历集合。您可以通过向 Iterable 询问 Iterator 来遍历 Iterable,并且可以多次这样做。
【讨论】: