为什么Iterator界面没有扩展Iterable?
该iterator()方法可以简单地返回this.
它是故意还是只是对Java设计师的监督?
能够使用像这样的迭代器的for-each循环会很方便:
for(Object o : someContainer.listSomeObjects()) {
....
}
Run Code Online (Sandbox Code Playgroud)
where listSomeObjects()返回一个迭代器.
可能重复:
为什么Java的迭代器不是Iterable?
据我所知,foreach循环是Java 5中添加的语法糖.所以
Iterable<O> iterable;
for(O o : iterable) {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
将基本上产生相同的字节码
Iterable<O> iterable;
for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) {
O o = iter.next();
// Do something
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我首先没有迭代,但只有一个迭代器(比如,因为一个类提供了两个不同的迭代器),我不能使用语法sugar foreach循环.显然我仍然可以做普通的旧式迭代.但是,我其实想做:
Iterator<O> iter;
for(O o : iter /* Iterator<O>, not Iterable<O>! */) {
// Do something
}
Run Code Online (Sandbox Code Playgroud)
当然我可以做假的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; …Run Code Online (Sandbox Code Playgroud) 当增强的for循环(foreach循环)被添加到Java时,它可以使用数组或目标Iterable.
for ( T item : /*T[] or Iterable<? extends T>*/ ) {
//use item
}
Run Code Online (Sandbox Code Playgroud)
这对于仅实现一种迭代类型的Collection类非常有用,因此只有一个iterator()方法.
但是我发现自己非常沮丧地想要使用Collection类中的非标准迭代器.例如,我最近试图帮助某人使用a Deque作为LIFO /堆栈,然后按FIFO顺序打印元素.我被迫这样做:
for (Iterator<T> it = myDeque.descendingIterator(); it.hasNext(); ) {
T item = it.next();
//use item
}
Run Code Online (Sandbox Code Playgroud)
我失去了for-each循环的优点.这不仅仅是击键.如果我不需要,我不喜欢暴露迭代器,因为很容易犯it.next()两次调用等错误.
理想情况下,我认为for-each循环应该也接受了Iterator.但事实并非如此.那么在这些情况下是否存在使用for-each循环的惯用方法?我也很想听到使用像Guava这样的常见集合库的建议.
我能想出的最好的帮助方法/类是:
for ( T item : new Iterable<T>() { public Iterator<T> iterator() { return myDeque.descendingIterator(); } } ) {
//use item
}
Run Code Online (Sandbox Code Playgroud)
哪个不值得使用.
我很想看到番石榴有类似的东西Iterables.wrap,但没有找到类似的东西.显然,我可以通过类或辅助方法滚动我自己的Iterator包装器.还有其他想法吗?
编辑:作为旁注,任何人都可以给出一个有效的理由,说明为什么增强的for循环不应该只接受一个Iterator?让我使用当前的设计可能会有很长的路要走.