为什么Iterator
接口不扩展Iterable
iterator()
方法可以简单地返回this
。
这是故意的,还是仅仅是对Java设计者的疏忽?
能够将for-each循环与以下迭代器一起使用会很方便:
for(Object o : someContainer.listSomeObjects()) {
....
}
其中listSomeObjects()
返回迭代器。
发布于 2009-05-08 10:23:02
因为迭代器通常指向集合中的单个实例。Iterable意味着你可以从一个对象获得一个迭代器来遍历它的元素-而不需要遍历单个实例,这就是迭代器所代表的。
发布于 2011-03-11 07:18:48
对于我的0.02美元,我完全同意Iterator不应该实现Iterable,但我认为增强的For循环也应该接受。我认为整个“使迭代器可迭代”的论点是为了解决语言中的一个缺陷。
引入增强的for循环的全部原因是它“在迭代集合和数组时消除了迭代器和索引变量的繁琐和错误倾向”[1]。
Collection<Item> items...
for (Iterator<Item> iter = items.iterator(); iter.hasNext(); ) {
Item item = iter.next();
...
}
for (Item item : items) {
...
}
那么为什么同样的论点不适用于迭代器呢?
Iterator<Iter> iter...
..
while (iter.hasNext()) {
Item item = iter.next();
...
}
for (Item item : iter) {
...
}
在这两种情况下,都删除了对hasNext()和next()的调用,并且内部循环中没有对迭代器的引用。是的,我知道Iterables可以被重用来创建多个迭代器,但这一切都发生在for循环之外:在循环内部,在迭代器返回的项上,每次只向前推进一项。
此外,允许这样做还可以方便地使用for循环for Enumerations,正如在其他地方指出的那样,它类似于迭代器而不是Iterables。
因此,不要让Iterator实现Iterable,但要更新for循环以接受这两种方法。
干杯,
发布于 2016-12-21 14:35:55
令人难以置信的是,还没有人给出这个答案。下面是如何使用新的Java8 Iterator.forEachRemaining()
方法“轻松”遍历Iterator
:
Iterator<String> it = ...
it.forEachRemaining(System.out::println);
当然,还有一种“更简单”的解决方案,可以直接使用foreach循环,将Iterator
封装在一个Iterable
lambda中:
for (String s : (Iterable<String>) () -> it)
System.out.println(s);
https://stackoverflow.com/questions/839178
复制相似问题