Java迭代器和for-each循环。有没有办法访问底层迭代器?
我非常喜欢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
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。你们这些人从来没有听说过函数式编程