如何在Java中使用Stream.forEach遍历元素

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

在Java中,Stream.forEach 是一种简洁高效的方式来遍历流中的每个元素。它属于 java.util.stream.Stream 接口,常用于对集合进行函数式风格的操作。

基本语法

forEach 方法接收一个 Consumer 函数式接口作为参数,表示对每个元素执行的操作。常见写法包括方法引用和Lambda表达式。

示例:使用 Lambda 表达式

假设有一个字符串列表,我们想逐个打印每个元素:

List names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(name -> System.out.println(name));

示例:使用方法引用

更简洁的写法是直接引用 System.out.println

names.stream().forEach(System.out::println);

遍历其他数据类型

除了字符串,也可以处理整数、对象等类型。

List numbers = 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 使用。

建议场景
  • 打印日志或调试信息
  • 调用外部服务或保存数据(注意线程安全)
  • 执行无返回值的副作用操作
基本上就这些。Stream.forEach 让代码更清晰,适合简单遍历任务。