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

Java:为什么不能在迭代器上迭代?
EN

Stack Overflow用户
提问于 2010-04-08 15:29:40
回答 5查看 22.2K关注 0票数 22

我读了Why is Java's Iterator not an Iterable?Why aren't Enumerations Iterable?,但我仍然不明白为什么会这样:

代码语言:javascript
复制
void foo(Iterator<X> it) {
  for (X x : it) {
    bar(x);
    baz(x);
  }
}

是不可能的。换句话说,除非我遗漏了什么,否则上面的语法可能是非常好和有效的语法糖:

代码语言:javascript
复制
void foo(Iterator<X> it) {
  for (X x; it.hasNext();) {
    x = it.next();
    bar(x);
    baz(x);
  }
}
EN

回答 5

Stack Overflow用户

发布于 2010-04-08 15:37:17

这很可能是因为迭代器不可重用;每次要迭代元素时,都需要从Iterable集合中获取一个新的Iterator。但是,作为一个快速解决方案:

代码语言:javascript
复制
private static <T> Iterable<T> iterable(final Iterator<T> it){
     return new Iterable<T>(){ public Iterator<T> iterator(){ return it; } };
}

//....
{
     // ...
     // Now we can use:
     for ( X x : iterable(it) ){
        // do something with x
     }
     // ...
}
//....

也就是说,最好的做法是简单地传递Iterable<T>接口而不是Iterator<T>

票数 19
EN

Stack Overflow用户

发布于 2010-04-08 15:38:11

for(Type t : iterable)语法仅对实现Iterable<Type>的类有效。

迭代器不实现iterable。

您可以迭代像Collection<T>List<T>Set<T>这样的东西,因为它们实现了Iterable。

以下代码等效:

代码语言:javascript
复制
for (Type t: list) {
    // do something with t
}

代码语言:javascript
复制
Iterator<Type> iter = list.iterator();
while (iter.hasNext()) {
    t = iter.next();
    // do something with t
}

之所以不能实现这一点,是因为for-each语法被添加到语言中以抽象出Iterator。使用迭代器使for-each循环工作不会完成创建for-each循环的目的。

票数 7
EN

Stack Overflow用户

发布于 2015-07-29 23:30:10

实际上,你可以的。

在java 8上有一个非常简短的解决方法:

代码语言:javascript
复制
for (X item : (Iterable<X>) () -> iterator)

有关该技巧的详细解释,请参阅How to iterate with foreach loop over java 8 stream

在相关问题中可以找到一些解释为什么这不是本机支持的:

Why does Stream not implement Iterable?

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2598219

复制
相关文章

相似问题

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