使用给定迭代器的每个循环的惯用方式?
当增强的 for 循环(foreach 循环)添加到 Java 中时,它被用作数组或 .Iterable
for ( T item : /*T[] or Iterable<? extends T>*/ ) {
//use item
}
这对于仅实现一种类型的迭代,因此具有单个方法的集合类非常有用。iterator()
但是我发现自己非常沮丧,因为我想使用来自集合类的非标准迭代器。例如,我最近试图帮助某人将a用作LIFO /堆栈,然后按FIFO顺序打印元素。我被迫这样做:Deque
for (Iterator<T> it = myDeque.descendingIterator(); it.hasNext(); ) {
T item = it.next();
//use item
}
我失去了 for-each 循环的优势。这不仅仅是击键。如果没有必要,我不喜欢公开迭代器,因为很容易犯调用两次的错误,等等。it.next()
现在理想情况下,我认为 for-each 循环也应该接受一个。但事实并非如此。那么,在这些情况下,是否有一种惯用的方法可以使用for-each循环呢?我也想听听使用番石榴等常见馆藏库的建议。Iterator
在帮助器方法/类之外,我能想到的最好的是:
for ( T item : new Iterable<T>() { public Iterator<T> iterator() { return myDeque.descendingIterator(); } } ) {
//use item
}
这是不值得使用的。
我很想看到番石榴有类似的东西来做这个习语,但没有找到这样的东西。显然,我可以通过类或帮助器方法滚动我自己的迭代器包装器。还有其他想法吗?Iterables.wrap
编辑:作为旁注,任何人都可以给出一个有效的理由来解释为什么增强的for循环不应该只接受一个?这可能对让我接受当前的设计有很长的路要走。Iterator