当增强的 for 循环(foreach 循环)被添加到 Java 中时,它可以处理数组或数组的目标Iterable
.
for ( T item : /*T[] or Iterable<? extends T>*/ ) {
//use item
}
这对于仅实现一种迭代类型的 Collection 类非常有用,因此具有单个iterator()
method.
但当我想使用 Collection 类中的非标准迭代器时,我发现自己非常沮丧。例如,我最近试图帮助某人使用Deque
作为 LIFO/堆栈,然后按 FIFO 顺序打印元素。我被迫这样做:
for (Iterator<T> it = myDeque.descendingIterator(); it.hasNext(); ) {
T item = it.next();
//use item
}
我失去了 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
}
哪个不值得使用。
我很想看到番石榴有类似的东西Iterables.wrap
使这成为惯用语,但没有找到类似的东西。显然,我可以通过类或辅助方法推出我自己的迭代器包装器。还有其他想法吗?
Edit:作为旁注,任何人都可以给出一个有效的理由来解释为什么增强的 for 循环不应该只接受一个Iterator
?这可能会对我接受当前的设计大有帮助。