Java迭代器和for-each循环。有没有办法访问底层迭代器?

Java迭代器和for-each循环。有没有办法访问底层迭代器?,java,iterator,foreach,Java,Iterator,Foreach,我非常喜欢Java中的for-each循环结构(for(te:iterable)),它可以在任何iterable上工作,因为它在很多情况下都非常容易读取和编写代码 我想知道是否有任何方法可以从这样的循环中访问底层迭代器。如果我想从迭代器中使用remove(),这是必须的。否,for-each循环的全部要点是抽象出底层迭代器 如果需要,必须声明它。使用for循环。否,不能删除for-each循环中的对象 改用这个: Iterator<Type> it = collection.iter

我非常喜欢Java中的for-each循环结构(
for(te:iterable)
),它可以在任何
iterable
上工作,因为它在很多情况下都非常容易读取和编写代码


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

否,for-each循环的全部要点是抽象出底层迭代器


如果需要,必须声明它。

使用for循环。

否,不能删除for-each循环中的对象

改用这个:

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

while (it.hasNext()) {
   if (it.next().shouldBeRemoved()) {
       it.remove();
   }
}
Iterator it=collection.Iterator();
while(it.hasNext()){
如果(it.next().shouldBeRemoved()){
it.remove();
}
}

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

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

for(T e : collection.clone())
    if(e.shouldBeRemoved())
        collection.remove();
更好的是,Apache CollectionUtils(可能有Google替代品和泛型替代品)提供了
过滤器(java.util.Collection Collection,Predicate Predicate)
。此示例返回整个列表。您可以存储谓词以供重用

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

您是正确的,使用迭代器可以通过调用remove()从源集合中安全地删除对象在迭代器本身上。这里的要点是避免ConcurrentModifiedException,这意味着在迭代器打开时对集合进行了修改。某些集合可以让您在对集合进行迭代时删除或添加元素,但在迭代器上调用remove()是更安全的做法


但是迭代器支持派生的、功能更强大的表迭代器ListIterator,它只从列表中可用,支持在迭代过程中从列表中添加和删除,以及双向滚动列表。

我通常更喜欢
for
习惯用法,而不是
while
习惯用法,因为它保留了迭代器更小。@dty:您希望使所有变量的作用域尽可能窄是有道理的。但对我来说,代码的可读性是第一位的。我的版本几乎可以像普通的句子一样阅读:“当迭代器有下一个元素时,请执行以下操作:…”,而您的操作似乎非常繁琐。因此,如果我们想从在这两种方法中,将我的代码提取到一个单独的方法是值得的。这是解决这个问题的最好方法,IMHO。当你声明它时,如果你打算从列表中删除项,它应该是一个ListIterator。你们这些人从来没有听说过函数式编程