我非常喜欢Java中的for-each循环结构(for(T e : iterable)
),它适用于任何Iterable<T>
,因为它使得在许多情况下编写和阅读代码变得非常容易。
但是我想知道是否有办法从这样的循环中访问底层的迭代器。如果我想使用迭代器的remove()
方法,这可能是必需的。
不,for-each循环的整个重点在于抽象化底层迭代器。
如果你需要它,你必须声明它。
不,你不能在for each循环中删除对象。
应该使用以下方式代替:
Iterator<Type> it = collection.iterator();
while (it.hasNext()) {
if (it.next().shouldBeRemoved()) {
it.remove();
}
}
for
循环而不是 while
循环,因为它可以使迭代器的作用域更小。 - dty如果集合比较小,您可以选择使用集合的副本来进行迭代,这样如果您想要删除元素,就不必像拥有两个集合一样操作。
for(T e : collection.clone())
if(e.shouldBeRemoved())
collection.remove();
filter(java.util.Collection collection,Predicate predicate)
。此示例返回整个列表。您可以存储可重用的谓词。CollectionUtils.filter(collection, new Predicate(){
boolean evaluate(Object object){return true;}
});
你是正确的,使用迭代器支持通过在迭代器本身上调用remove()方法,从源集合中安全地删除对象。这里的重点是避免ConcurrentModifiedException,这意味着在打开迭代器时修改了集合。一些集合将允许您在迭代过程中删除或添加元素到集合中,但在迭代器上调用remove()方法是更安全的做法。
但是,迭代器支持一个派生且更强大的表亲ListIterator,仅适用于列表,支持在迭代过程中从列表中添加和删除,以及双向滚动列表。