我非常喜欢Java中的for-each-loop构造(for(T e : iterable)
),它适用于任何Iterable<T>
,因为它在很多情况下非常容易阅读和编写代码。
我想知道是否有任何方法可以从这样的循环访问底层迭代器。如果我想使用迭代器中的remove()
,这可能是必需的。
答案 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循环中丢失((有点**