Java Lambda表达式用于集合遍历,核心是简洁表达“对每个元素做什么”,forEach适用于副作用操作,Map推荐双参数forEach,复杂逻辑应提取为方法,避免在forEach中进行计算或中断控制。

Java 中 Lambda 表达式用于集合遍历,核心是用简洁语法表达“对每个元素做什么”,不是为炫技,而是让意图一目了然、改动更安全。
直接用 forEach + Lambda 处理 List 和 Set
所有实现了 Iterable 的集合(如 ArrayList、HashSet)都自带 forEach 方法,无需转 Stream:
- 单参数单行操作可省略括号和大括号:
list.forEach(item -> System.out.println(item)) - 若只是调用已有方法(如打印、记录日志),优先用方法引用:
list.forEach(System.out::println),语义更清晰,性能略好 - Set 同样适用:
set.forEach(System.out::println),顺序不保证但写法一致
Map 遍历推荐用双参数 forEach
Map 自带 forEach(BiConsumer<K,V>),比传统 entrySet + for 更直观:
- 直接拿到键和值:
map.forEach((k, v) -> System.out.println(k + "=" + v)) - 避免手动写
entry.getKey()和entry.getValue(),减少出错可能 - 不建议先取 keySet() 再 get(),既低效又易空指针
别把计算逻辑硬塞进 forEach
forEach 是终端操作,只适合副作用(如打印、修改外部状态、发日志),不返回结果,也不支持中断或链式处理:
立即学习“Java免费学习笔记(深入)”;
- 想生成新集合(比如转大写):用
stream().map(...).collect(...) - 想过滤后统计数量:用
stream().filter(...).count(),而不是在 forEach 里手动 ++ - 想求和或找最大值:用
stream().mapToInt(...).sum()或reduce(),逻辑明确且线程安全可控
注意几个容易忽略的实际细节
写顺手了容易踩坑,影响可维护性和运行稳定性:
- Lambda 内不能修改非 final 的局部变量;真要累加建议用
AtomicInteger或拆成独立方法 - 含 if-else、异常处理或复杂分支时,IDE 断点进不去 Lambda 体,建议提取为普通方法再引用
- 不支持
break或continue;需要提前退出就换anyMatch、findFirst或传统 for 循环 - 并发场景下默认串行;若用
parallelStream(),必须确保操作无共享状态、无副作用


















