Java迭代器和for-each-loop。任何方式访问底层迭代器?

时间:2010-10-15 12:08:48

标签: java iterator foreach

我非常喜欢Java中的for-each-loop构造(for(T e : iterable)),它适用于任何Iterable<T>,因为它在很多情况下非常容易阅读和编写代码。

我想知道是否有任何方法可以从这样的循环访问底层迭代器。如果我想使用迭代器中的remove(),这可能是必需的。

6 个答案:

答案 0 :(得分:17)

不,for-each-loop的重点是抽象掉底层迭代器。

如果您需要,您必须申报。

答案 1 :(得分:4)

不,你不能删除每个循环中的对象。

请改用:

Iterator<Type> it = collection.iterator();

while (it.hasNext()) {
   if (it.next().shouldBeRemoved()) {
       it.remove();
   }
}

答案 2 :(得分:1)

改为使用for循环。

答案 3 :(得分:1)

如果集合相当小,您可以使用集合的副本进行迭代,如果您希望能够删除元素,那么您就不必像使用两个集合那样行事。

for(T e : collection.clone())
    if(e.shouldBeRemoved())
        collection.remove();

更好的是,Apache CollectionUtils(可能还有Google替代品和泛型替代品)提供filter(java.util.Collection collection, Predicate predicate)。此示例返回整个列表。您可以存储谓词以供重用。

CollectionUtils.filter(collection, new Predicate(){
        boolean evaluate(Object object){return true;}
    });

答案 4 :(得分:1)

你是对的,使用Iterator支持通过在Iterator本身上调用remove()来安全地从源集合中删除对象的能力。这里的要点是避免ConcurrentModifiedException,这意味着在Iterator打开它时修改了一个集合。有些集合可以让你在迭代过程中删除或添加元素,但在迭代器上调用remove()是一种更安全的做法。

但Iterator支持派生且功能更强大的堂兄 ListIterator ,仅在列表中提供,支持在迭代期间从列表中添加和删除,以及双向滚动列表。

答案 5 :(得分:0)

修改数据有一种错误的感觉,只需创建一个新的Iterable(或集合)并添加你想要保留的项目,其他时间在for循环中丢失((有点**