java中lambda遍历集合主要用foreach()、stream().foreach()及filter()+map()链式操作:foreach()直接执行动作不返回新集合;stream()支持惰性筛选转换后遍历;需避免修改外部变量、聚合操作及空指针,依场景选合适方式。

Java 中 Lambda 表达式在集合遍历中主要通过 forEach()、stream().forEach() 和链式流操作(如 filter() + map())来实现,核心是把“要对每个元素做什么”直接作为参数传入,省去循环结构和匿名内部类。
用 forEach() 替代增强 for 循环
Collection 接口在 Java 8 中新增了 forEach(Consumer super E>) 方法,可直接配合 Lambda 使用:
-
list.forEach(s -> System.out.println(s));—— 打印每个字符串 -
list.forEach(System.out::println);—— 方法引用更简洁,性能略优 - 注意:
forEach()是终端操作,不返回新集合;它只是执行动作,不改变原集合
用 Stream 配合 filter/map 做条件遍历与转换
当需要筛选或转换后再遍历时,推荐走 stream() 流式链路:
-
list.stream().filter(s -> s.length() > 3).forEach(System.out::println);—— 只打印长度大于 3 的字符串 -
list.stream().filter(Objects::nonNull).map(String::toUpperCase).forEach(System.out::println);—— 先去空、再转大写、再打印 - 关键点:
filter()和map()是中间操作,惰性求值;forEach()是终端操作,真正触发执行
避免常见陷阱
看似简单,但实际使用中容易出错:
- 不要在
forEach()里修改外部变量(除非是 final 或事实 final),尤其在并行流中会出问题 - 别在
forEach()里做聚合(如拼字符串、累加),应改用collect()或reduce() - 遇到可能为
null的元素,记得显式判空,比如filter(u -> u != null && u.isActive()) - 小集合或逻辑极简时,传统 for 循环反而更直观、更易调试,不必强行函数式
按场景选对方法
不同目标对应不同写法:
- 单纯遍历打印 →
list.forEach(System.out::println) - 边过滤边处理 →
list.stream().filter(...).forEach(...) - 需要结果集合 → 把
forEach()换成collect(Collectors.toList()) - 要提前终止(如找第一个匹配项)→ 用
findFirst()而非forEach()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











