Stream.forEach用于遍历流元素,支持Lambda和方法引用,如names.stream().forEach(System.out::println);可处理各类数据类型并适用于打印、调用服务等场景,但不保证并行流顺序,无法中断循环,需注意线程安全与副作用。

在Java中,Stream.forEach 是一种简洁高效的方式来遍历流中的每个元素。它属于 java.util.stream.Stream 接口,常用于对集合进行函数式风格的操作。
基本语法
forEach 方法接收一个 Consumer 函数式接口作为参数,表示对每个元素执行的操作。常见写法包括方法引用和Lambda表达式。
假设有一个字符串列表,我们想逐个打印每个元素:
List示例:使用方法引用names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(name -> System.out.println(name));
更简洁的写法是直接引用 System.out.println:
立即学习“Java免费学习笔记(深入)”;
names.stream().forEach(System.out::println);
遍历其他数据类型
除了字符串,也可以处理整数、对象等类型。
Listnumbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().forEach(n -> System.out.println("数字: " + n));
对于自定义对象,比如用户类:
class User {
String name;
int age;
User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + "(" + age + ")";
}
}
List users = Arrays.asList(
new User("Tom", 25),
new User("Jerry", 30)
);
users.stream().forEach(System.out::println);
注意事项
不能保证顺序:如果使用的是并行流(parallelStream),元素的处理顺序是不确定的。若需保持顺序,应使用普通 stream 或确保操作无副作用。
无法修改外部变量:Lambda 中不能修改外部的局部变量,但可以访问 final 或等效于 final 的变量。
不支持 break/continue:与传统 for 循环不同,forEach 不支持中断遍历。如需条件控制,可结合 filter 使用。
- 打印日志或调试信息
- 调用外部服务或保存数据(注意线程安全)
- 执行无返回值的副作用操作










