什么是替换For-Each循环进行过滤?

Ash*_*wal 2 java foreach list

虽然for-each循环有许多优点,但问题是,当你想过滤(过滤意味着从列表中删除元素)一个列表时,它不起作用,你能不能取代任何替代,因为即使遍历索引也不是一个好选择. .

Chs*_*y76 11

"过滤"是什么意思?从列表中删除某些元素?如果是这样,您可以使用迭代器:

for(Iterator<MyElement> it = list.iterator(); it.hasNext(); ) {
    MyElement element = it.next();
    if (some condition) {
      it.remove();
    }
}
Run Code Online (Sandbox Code Playgroud)

更新(根据评论):

请考虑以下示例来说明迭代器的工作原理.假设我们有一个包含'A'和'B'的列表:

AABBA

我们想要删除所有那些讨厌B的东西.因此,使用上面的循环,代码将按如下方式工作:

  1. hasNext()?是.下一个().element指向第一A.
  2. hasNext()?是.下一个().element指向第二A.
  3. hasNext()?是.下一个().element指向第1个B.删除().迭代器计数器不会改变,它仍然指向B所在的位置(从技术上讲,这不是完全正确的,但从逻辑上讲它是如何工作的).如果你现在再次调用remove(),你会得到一个异常(因为列表元素不再存在).
  4. hasNext()?是.下一个().element指向第二B.其余与#3相同
  5. hasNext()?是.下一个().element指向第3 A.
  6. hasNext()?不,我们已经完成了.列表现在有3个元素.

更新#2:remove()在迭代器上操作确实是可选的 - 但仅仅因为它在底层集合上是可选的.这里的底线是 - 如果您的集合支持它(以及Java Collection Framework中的所有集合),迭代器也是如此.如果你的收藏品不支持它,那么你运气不好.