首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Java的迭代器不是迭代器?

为什么Java的迭代器不是迭代器?
EN

Stack Overflow用户
提问于 2009-05-08 10:19:43
回答 12查看 50.3K关注 0票数 184

为什么Iterator接口不扩展Iterable

iterator()方法可以简单地返回this

这是故意的,还是仅仅是对Java设计者的疏忽?

能够将for-each循环与以下迭代器一起使用会很方便:

代码语言:javascript
复制
for(Object o : someContainer.listSomeObjects()) {
    ....
}

其中listSomeObjects()返回迭代器。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2009-05-08 10:23:02

因为迭代器通常指向集合中的单个实例。Iterable意味着你可以从一个对象获得一个迭代器来遍历它的元素-而不需要遍历单个实例,这就是迭代器所代表的。

票数 68
EN

Stack Overflow用户

发布于 2011-03-11 07:18:48

对于我的0.02美元,我完全同意Iterator不应该实现Iterable,但我认为增强的For循环也应该接受。我认为整个“使迭代器可迭代”的论点是为了解决语言中的一个缺陷。

引入增强的for循环的全部原因是它“在迭代集合和数组时消除了迭代器和索引变量的繁琐和错误倾向”[1]。

代码语言:javascript
复制
Collection<Item> items...

for (Iterator<Item> iter = items.iterator(); iter.hasNext(); ) {
    Item item = iter.next();
    ...
}

for (Item item : items) {
    ...
}

那么为什么同样的论点不适用于迭代器呢?

代码语言:javascript
复制
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循环以接受这两种方法。

干杯,

票数 64
EN

Stack Overflow用户

发布于 2016-12-21 14:35:55

令人难以置信的是,还没有人给出这个答案。下面是如何使用新的Java8 Iterator.forEachRemaining()方法“轻松”遍历Iterator

代码语言:javascript
复制
Iterator<String> it = ...
it.forEachRemaining(System.out::println);

当然,还有一种“更简单”的解决方案,可以直接使用foreach循环,将Iterator封装在一个Iterable lambda中:

代码语言:javascript
复制
for (String s : (Iterable<String>) () -> it)
    System.out.println(s);
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/839178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档