我读了Why is Java's Iterator not an Iterable?和Why aren't Enumerations Iterable?,但我仍然不明白为什么会这样:
void foo(Iterator<X> it) {
for (X x : it) {
bar(x);
baz(x);
}
}
是不可能的。换句话说,除非我遗漏了什么,否则上面的语法可能是非常好和有效的语法糖:
void foo(Iterator<X> it) {
for (X x; it.hasNext();) {
x = it.next();
bar(x);
baz(x);
}
}
发布于 2010-04-08 15:37:17
这很可能是因为迭代器不可重用;每次要迭代元素时,都需要从Iterable集合中获取一个新的Iterator。但是,作为一个快速解决方案:
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>
发布于 2010-04-08 15:38:11
for(Type t : iterable)
语法仅对实现Iterable<Type>
的类有效。
迭代器不实现iterable。
您可以迭代像Collection<T>
、List<T>
或Set<T>
这样的东西,因为它们实现了Iterable。
以下代码等效:
for (Type t: list) {
// do something with t
}
和
Iterator<Type> iter = list.iterator();
while (iter.hasNext()) {
t = iter.next();
// do something with t
}
之所以不能实现这一点,是因为for-each语法被添加到语言中以抽象出Iterator
。使用迭代器使for-each循环工作不会完成创建for-each循环的目的。
发布于 2015-07-29 23:30:10
实际上,你可以的。
在java 8上有一个非常简短的解决方法:
for (X item : (Iterable<X>) () -> iterator)
有关该技巧的详细解释,请参阅How to iterate with foreach loop over java 8 stream。
在相关问题中可以找到一些解释为什么这不是本机支持的:
https://stackoverflow.com/questions/2598219
复制相似问题