虽然 for-each 循环有很多优点,但问题是,当你想过滤(过滤意味着从列表中删除元素)一个列表时,它不起作用,你能请任何替换,因为即使遍历索引也不是不错的选择..
最佳答案
“过滤”是什么意思?从列表中删除某些元素?如果是这样,您可以使用 iterator :
for(Iterator<MyElement> it = list.iterator(); it.hasNext(); ) {
MyElement element = it.next();
if (some condition) {
it.remove();
}
}
更新(基于评论):
考虑以下示例来说明迭代器的工作原理。假设我们有一个包含“A”和“B”的列表:
A A B B A
我们想删除所有那些讨厌的 B
。因此,使用上面的循环,代码将按如下方式工作:
- 有下一个()?是的。下一个()。
element
指向 1st A. - 有下一个()?是的。下一个()。
element
指向 2nd A. - 有下一个()?是的。下一个()。
element
指向 1st B.remove()。迭代器计数器不会改变,它仍然指向 B 所在的位置(从技术上讲,这并不完全正确,但从逻辑上讲,它就是这样工作的)。如果您现在再次调用 remove(),则会出现异常(因为列表元素不再存在)。 - 有下一个()?是的。下一个()。
element
指向2nd B,其余同#3 - 有下一个()?是的。下一个()。
element
指向 3rd A. - 有下一个()?不,我们完成了。列表现在有 3 个元素。
更新 #2:remove()
操作在迭代器上确实是可选的 - 但只是因为它在基础集合上是可选的。这里的底线是——如果您的集合支持它(Java 集合框架中的所有集合都支持),那么迭代器也支持。如果您的 Collection 不支持它,那么您无论如何都不走运。
关于java - 用于过滤的 For-Each 循环的替代品是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1504790/