在Java中,stream.forEach
方法用于对流中的每个元素执行给定的操作。它通常用于终端操作(终结流的处理)并对流中的每个元素应用一种操作,但不会返回新的流。
用法
forEach
方法接受一个Consumer
函数式接口,用于定义对每个元素要执行的操作。
示例代码
1. 打印流中的每个元素
import java.util.Arrays;
import java.util.List;
public class ForEachExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream().forEach(n -> System.out.println(n));
// 或者
numbers.stream().forEach(System.out::println);
}
}
2. 对象列表中对每个元素执行操作
假设我们有一个Person
类,并希望对每个Person
对象执行某个操作,例如打印其信息。
import java.util.Arrays;
import java.util.List;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
public class ForEachExample {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("John", 30),
new Person("Jane", 25),
new Person("Tom", 35)
);
people.stream().forEach(person -> System.out.println(person));
// 或者
people.stream().forEach(System.out::println);
}
}
注意事项
forEach
是一个终端操作,会对流中的每个元素执行给定的操作,并不会返回新的流。- 如果需要修改集合或依赖于元素的顺序,请注意并发修改问题。在并行流中使用时,要小心共享可变状态。
更复杂的例子
结合其他流操作使用forEach
,例如过滤、映射和排序。
import java.util.Arrays;
import java.util.List;
public class ForEachComplexExample {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "banana", "cherry", "date", "fig", "grape");
words.stream()
.filter(word -> word.contains("a")) // 过滤包含'a'的字符串
.map(String::toUpperCase) // 转换为大写
.sorted() // 排序
.forEach(System.out::println); // 打印
}
}
总结
stream.forEach
方法非常适合在流处理中执行简单的终端操作,如打印、累加等。在使用流时,应根据实际需求选择合适的中间操作和终端操作,以实现高效、简洁的代码。
下一步建议:
a. 尝试使用forEach
与其他终端操作(如collect
、reduce
)结合,理解其不同用法。
b. 在项目中使用stream.forEach
来处理数据,提升代码的可读性和效率。