Iterator本身不提供过滤功能,仅支持遍历和安全移除;实际过滤需结合逻辑判断与remove(),或改用Stream、增强for循环等更合适方式。

Iterator 不能直接过滤,但可以边遍历边删
Iterator 的 remove() 是唯一允许在遍历时修改集合的操作。所以“过滤”实际是:保留满足条件的元素 → 删除不满足的元素。
例如,从 List 中移除所有长度小于 3 的字符串:
- 获取迭代器:
Iterator<string> it = list.iterator();</string> - 循环中检查每个元素:
if (it.next().length() - 满足条件就调用
it.remove()
⚠️ 注意:必须先调用 next() 才能调用 remove(),否则抛 IllegalStateException;也不能连续调两次 remove()。
更自然的过滤方式:别硬用 Iterator
如果目标是“得到一个新集合”,而不是原地修改,Iterator 就不是最佳选择。推荐以下方式:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
Stream API(推荐,JDK 8+):一行搞定,语义清晰
list.stream().filter(s -> s.length() >= 3).collect(Collectors.toList()) -
增强 for 循环 + 新集合:简单直观,适合小数据量
List<string> filtered = new ArrayList(); for (String s : list) if (s.length() >= 3) filtered.add(s);</string> - 传统 for 倒序遍历 + remove():避免索引错位,适合必须原地修改且不用 Iterator 的场景
为什么不能用 Iterator 实现“正向过滤构造新集合”?
Iterator 是单向、一次性的游标,它没有“跳过”或“预读”能力,也不返回布尔结果。它的设计目标是“访问 + 安全删除”,不是“筛选生成”。试图用它构建过滤逻辑,代码会冗长、易错,且违背其使用意图。
比如想保留某些元素并放进新 List,你仍得手动 new List + add —— 这时 Iterator 只是多了一层不必要的封装,不如直接用 for 或 Stream。
特殊情况:ListIterator 支持双向 + 替换,但依然不等于过滤
ListIterator 比普通 Iterator 多了 add() 和 set(),可边走边插或改值,但它仍不具备条件筛选能力。若真需在遍历中动态构建新结构,建议用 Stream 或显式收集逻辑。

















