Iterator 不负责过滤,仅支持安全遍历与条件删除;真正数据清洗应由业务逻辑、removeIf() 或 Stream.filter() 完成,需分清遍历、过滤、流式处理的职责边界。

Java 中 Iterator 本身不参与“流式处理前”的预处理,它只是遍历工具;所谓“在流式处理前用 Iterator 过滤脏数据”,本质上是个常见误解——Iterator 不负责过滤,只负责安全删除或按需跳过。真正做数据清洗和条件筛选的,是你的业务逻辑配合遍历机制。关键在于:别把遍历、过滤、流式处理混为一谈,要分清阶段和职责。
Iterator 的核心作用是安全遍历与条件删除
它不提供 filter() 那样的声明式语义,但能让你在遍历过程中安全地移除脏数据,避免 ConcurrentModificationException。适用于需要原地清理、且逻辑不能或不便转成 Stream 的场景(比如老项目、受限于 JDK 版本、或需在删除时同步执行副作用)。
- 调用
iterator()获取迭代器后,必须用it.remove()删除,不能调collection.remove() -
hasNext()+next()是标准组合,remove()只能在next()之后立即调用一次 - 示例:清理 null 或空字符串
Iterator<String> it = list.iterator(); while (it.hasNext()) { String s = it.next(); if (s == null || s.trim().isEmpty()) { it.remove(); // ✅ 安全删除 } }
真正的“流式处理前过滤”应交给 Stream 或预处理逻辑
如果你后续要用 stream() 做映射、排序、聚合等操作,脏数据应在 .stream() 调用之前就剔除干净,或直接在 filter() 中拦截。Iterator 并不是前置过滤的推荐手段。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 推荐做法:用
Collection.removeIf()快速原地清理(语义更清晰,代码更短)list.removeIf(s -> s == null || s.trim().isEmpty()); // 保留非空有效字符串 List<String> cleanList = list.stream().map(String::toUpperCase).collect(toList());
- 或者一步到位,不过滤原集合,直接在 Stream 中筛:
List<String> result = list.stream() .filter(Objects::nonNull) .filter(s -> !s.trim().isEmpty()) .map(String::trim) .collect(toList());
注意脏数据类型,提前防御 NPE
很多“脏数据”表现为 null、空集合、非法状态对象。在用 Iterator 或 Stream 前,建议统一加固:
立即学习“Java免费学习笔记(深入)”;
- 对集合本身判空:
if (list == null) return Collections.emptyList(); - 在
filter()中优先放Objects::nonNull,防止后续字段访问抛NullPointerException - 若对象字段可能为 null(如
user.getAddress().getCity()),改用Optional或判空链式写法:filter(u -> u != null && u.getAddress() != null && "BJ".equals(u.getAddress().getCity()))
不需要强行用 Iterator 做“前置过滤”,该删就用 removeIf(),该筛就用 stream().filter(),各司其职才稳。

















