java中iterator不能直接过滤元素,但可通过其remove()方法实现就地过滤,即遍历中删除不满足条件的元素;若需新集合则推荐stream.filter()或removeif()。

Java 中不能直接用 Iterator 过滤元素,因为 Iterator 本身只提供遍历和安全删除(remove())能力,不支持“跳过”或“筛选出新集合”。但可以结合 Iterator 的 remove() 方法实现「就地过滤」——即在遍历过程中移除不符合条件的元素。
用 Iterator.remove() 实现就地过滤
这是最符合「用 Iterator 过滤」原意的做法:遍历集合,对不满足条件的元素调用 iterator.remove() 删除它。注意必须用迭代器自己的 remove(),不能用集合的 remove(),否则会抛 ConcurrentModificationException。
示例:移除列表中所有偶数
List<integer> list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5, 6));
Iterator<integer> it = list.iterator();
while (it.hasNext()) {
Integer n = it.next();
if (n % 2 == 0) { // 条件:是偶数 → 移除
it.remove();
}
}
// list 现在为 [1, 3, 5]
</integer></integer>
注意 remove() 的限制和规则
- 必须先调用
next()才能调用remove(),否则抛IllegalStateException -
remove()每次只能删一个元素,且不能连续调用两次(中间必须有next()) - 仅适用于支持删除的集合(如
ArrayList、LinkedList),Arrays.asList()返回的列表不支持remove() - 该操作会修改原集合,不是生成新集合
如果需要保留原集合,推荐用 Stream 过滤
若目标是「获取符合条件的新集合」而非修改原集合,Stream.filter() 更自然、安全、可读:
List<integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
List<integer> odds = list.stream()
.filter(n -> n % 2 != 0)
.collect(Collectors.toList());
// odds = [1, 3, 5],原 list 不变
</integer></integer>
这是 Java 8+ 的标准做法,支持链式操作、并行处理,也避免了并发修改问题。
其他替代方案简要对比
- for-each 循环 + 新集合:手动新建列表,遍历原集合添加符合条件元素 —— 安全但略啰嗦
-
Collection.removeIf():JDK 8 新增,一行代码完成就地过滤,内部用的就是
Iterator:list.removeIf(n -> n % 2 == 0) -
第三方库(如 Guava):提供
Iterables.filter(),返回惰性视图,不立即复制
不复杂但容易忽略:Iterator 本身没有 filter 方法,它的核心价值在于安全遍历与删除;真正做条件筛选时,优先考虑语义更清晰的 Stream 或 removeIf。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











