我非常喜欢Java中的for-each-loop构造(for(T e : iterable)
),它可以在任何Iterable<T>
上工作,因为它使得在很多情况下很容易读取和编写代码。Java迭代器和for-each-loop。任何方式来访问基础迭代器?
我想知道,如果有什么办法可以从这样的循环访问基础迭代器。如果我想使用迭代器中的remove()
,这可能是强制性的。
我非常喜欢Java中的for-each-loop构造(for(T e : iterable)
),它可以在任何Iterable<T>
上工作,因为它使得在很多情况下很容易读取和编写代码。Java迭代器和for-each-loop。任何方式来访问基础迭代器?
我想知道,如果有什么办法可以从这样的循环访问基础迭代器。如果我想使用迭代器中的remove()
,这可能是强制性的。
不,这个for-each-loop的整个点是抽象出底层的迭代器。
如果你需要它,你必须声明它。
改为使用for循环。
不,你不能删除每个循环中的对象。
用这个代替:
Iterator<Type> it = collection.iterator();
while (it.hasNext()) {
if (it.next().shouldBeRemoved()) {
it.remove();
}
}
如果集合相当小,您可以选择使用该集合的副本进行迭代,如果您希望能够删除元素,那么您将不必采取行动如果你有两个系列。
for(T e : collection.clone())
if(e.shouldBeRemoved())
collection.remove();
更好的是,Apache CollectionUtils(有可能是谷歌的替代品和替代品)提供filter(java.util.Collection collection, Predicate predicate)
。这个例子返回整个列表。您可以存储谓词以供重用。
CollectionUtils.filter(collection, new Predicate(){
boolean evaluate(Object object){return true;}
});
你是正确的,使用迭代器支持从源集合安全地删除对象,通过对迭代器本身调用remove()的能力。这里的要点是避免一个ConcurrentModifiedException,这意味着一个集合在Iterator打开时被修改。有些集合可以让你在迭代时删除或添加元素到集合中,但是在Iterator上调用remove()是一种更安全的做法。
但迭代器支持派生和更强大的表弟的ListIterator,只能从列表,支持添加和迭代过程中从列表中删除,以及通过列表滚动双向。
而且当你声明它时,如果你打算从列表中删除项目,它应该是一个ListIterator。 – 2010-10-15 12:52:19