【发布时间】:2011-04-25 22:03:15
【问题描述】:
我非常喜欢 Java 中的 for-each-loop 构造 (for(T e : iterable)),它适用于任何 Iterable<T>,因为它在许多情况下都非常易于阅读和编写代码。
我想知道是否有任何方法可以从这样的循环中访问底层迭代器。如果我想使用迭代器中的remove(),这可能是强制性的。
【问题讨论】:
我非常喜欢 Java 中的 for-each-loop 构造 (for(T e : iterable)),它适用于任何 Iterable<T>,因为它在许多情况下都非常易于阅读和编写代码。
我想知道是否有任何方法可以从这样的循环中访问底层迭代器。如果我想使用迭代器中的remove(),这可能是强制性的。
【问题讨论】:
不,for-each-loop 的全部意义在于抽象出底层迭代器。
如果你需要它,你必须声明它。
【讨论】:
不,您不能在 for each 循环中删除对象。
改用这个:
Iterator<Type> it = collection.iterator();
while (it.hasNext()) {
if (it.next().shouldBeRemoved()) {
it.remove();
}
}
【讨论】:
for 成语而不是while 成语,因为它使迭代器的范围更小。
改用 for 循环。
【讨论】:
如果集合相当小,如果您希望能够删除元素,您也可以使用集合的副本进行迭代,这样您就不必像有两个集合一样行事。
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;}
});
【讨论】:
您是对的,使用 Iterator 支持通过在 Iterator 本身上调用 remove() 来安全地从源集合中删除对象的能力。这里的重点是避免 ConcurrentModifiedException ,这意味着在 Iterator 针对它打开时修改了集合。一些集合可以让您在遍历集合时轻松移除或添加元素,但在迭代器上调用 remove() 是一种更安全的做法。
但 Iterator 支持派生的和更强大的表亲 ListIterator,仅在 Lists 中可用,支持在迭代期间添加和从 List 中删除,以及在 Lists 中双向滚动。
【讨论】:
修改数据有一种错误的感觉,只需创建一个新的Iterable(或集合)并添加您想要保留的项目,其他时间在for循环中丢失((有点**
【讨论】: