Java 8 中 Lambda 表达式通过 forEach() 配合 Consumer 接口简化集合遍历,支持方法引用、Stream 过滤/转换,属内部迭代,无 break/continue,不支持遍历时修改集合,需注意变量有效性、调试及异常处理限制。

Java 8 中用 Lambda 表达式处理集合遍历,核心是借助 forEach() 方法配合 Consumer 函数式接口,让代码更简洁、意图更清晰。
直接用 forEach + Lambda 遍历
所有实现了 Iterable 接口的集合(如 List、Set)都可直接调用 forEach 方法:
- 基本写法:
list.forEach(item -> System.out.println(item)); - 单参数时括号可省略,单语句时大括号和分号也可省略
- 若只是调用已有方法(如打印),推荐方法引用写法:
list.forEach(System.out::println);,更简洁且语义明确
结合 Stream 做过滤与转换
单纯遍历不够时,可升级为 Stream 流式操作,链式调用更灵活:
- 过滤元素:
list.stream().filter(s -> s.startsWith("A")).forEach(System.out::println); - 转换数据:
list.stream().map(String::toUpperCase).forEach(System.out::println); - 注意:
filter和map是中间操作,必须接终端操作(如forEach、collect)才会真正执行
和传统遍历方式的区别
Lambda 遍历不是语法糖的简单替换,而是编程范式的转变:
立即学习“Java免费学习笔记(深入)”;
- 传统 for 循环或增强 for 是外部迭代,控制权在开发者手上;Lambda + forEach 是内部迭代,由集合自身决定如何遍历
- forEach 不提供 break/continue,也不支持修改原集合结构(如边遍历边 remove),需要这类逻辑时仍需用传统循环
- forEach 默认串行执行;如需并行,可用
parallelStream(),但要注意线程安全问题
实际使用注意事项
写得顺手,也容易踩坑:
- 不能在 Lambda 中修改外部局部变量(除非是 effectively final)
- 调试困难:IDE 断点无法逐行进入 Lambda 体,建议复杂逻辑拆到独立方法中再引用
- 异常处理受限:Lambda 表达式里抛出受检异常需包装,例如用 try-catch 包裹后转为运行时异常
- 性能无绝对优势:简单遍历场景下,for 循环往往更快;Stream 价值在于组合操作的表达力和潜在并行能力


















