可能重复:
为什么 Java 的 Iterator 不是 Iterable?
据我所知,foreach 循环是 Java 5 中添加的语法糖。所以
Iterable<O> iterable;
for(O o : iterable) {
// Do something
}
基本上会产生与
Iterable<O> iterable;
for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) {
O o = iter.next();
// Do something
}
但是,如果我一开始没有可迭代对象,而只有一个迭代器(比如说,因为一个类提供了两个不同的迭代器),我就不能使用语法糖 foreach 循环。显然我仍然可以进行简单的旧样式迭代。但是,我实际上想做:
Iterator<O> iter;
for(O o : iter /* Iterator<O>, not Iterable<O>! */) {
// Do something
}
当然我可以做一个假的Iterable
:
class Adapter<O> implements Iterable<O> {
Iterator<O> iter;
public Adapter(Iterator<O> iter) {
this.iter = iter;
}
@Override
public Iterator<O> iterator() {
return iter;
}
}
(这实际上是对 Iterable API 的丑陋滥用,因为它只能迭代一次!)
如果它是围绕Iterator
而不是可迭代设计的,可以做一些有趣的事情:
for(O o : iterable.iterator()) {} // Iterate over Iterable and Collections
for(O o : list.backwardsIterator()) {} // Or backwards
Iterator<O> iter;
for(O o : iter) {
if (o.something()) { iter.remove(); }
if (o.something()) { break; }
}
for(O : iter) { } // Do something with the remaining elements only.
有谁知道为什么语言是这样设计的?为了避免歧义,如果一个类同时实现Iterator
和Iterable
?为了避免假定“for(O o : iter)”将处理所有元素两次(并且忘记获取新的迭代器)的程序员错误?或者还有其他原因吗?
还是有一些我不知道的语言技巧?