Java Stream API 终止操作的详细解析
一、终止操作概述
- 定义:终止操作(Terminal Operations)是 Stream 处理流程的最后一步,触发流的遍历并生成结果,之后流不可再用。
- 核心特点:
- 触发计算:中间操作(如
filter
、map
)在终止操作调用时才会执行。 - 关闭流:流一旦终止,无法再执行其他操作。
- 返回非流结果:如基本类型、对象、集合或
void
。
- 触发计算:中间操作(如
二、常见终止操作分类
1. 遍历与消费
-
forEach(Consumer<T>)
遍历流中的每个元素,无返回值。List<String> list = Arrays.asList("A", "B", "C"); list.stream().forEach(System.out::println); // 输出 A B C
-
forEachOrdered(Consumer<T>)
在并行流中按顺序遍历元素(牺牲部分性能保证顺序)。list.parallelStream().forEachOrdered(System.out::println); // 顺序输出
2. 聚合与统计
-
count()
返回流中元素的总数。long count = Stream.of(1, 2, 3).count(); // 3
-
max(Comparator<T>)
/min(Comparator<T>)
返回最大/最小元素(返回Optional<T>
)。Optional<Integer> max = Stream.of(5, 2, 8).max(Integer::compare); // 8
-
sum()
/average()
仅适用于基本类型流(IntStream
、LongStream
、DoubleStream
)。int sum = IntStream.of(1, 2, 3).sum(); // 6 double avg = IntStream.of(1, 2, 3).average().orElse(0); // 2.0
3. 匹配与查找
-
anyMatch(Predicate<T>)
判断是否存在至少一个元素满足条件。boolean hasEven = Stream.of(1, 3, 5).anyMatch(n -> n % 2 == 0); // false
-
allMatch(Predicate<T>)
判断所有元素是否满足条件。boolean allPositive = Stream.of(1, 2, -3).allMatch(n -> n > 0); // false
-
noneMatch(Predicate<T>)
判断是否没有元素满足条件。boolean noEmpty = Stream.of("A", "B").noneMatch(String::isEmpty); // true
-
public static void main(String[] args) {//匹配person的名字是否都为”李白“System.out.println(PersonService.getPersons().stream().allMatch(new Predicate<Person>() {@Overridepublic boolean test(Person person) {return person.getName().equals("李白");}}));//匹配名字是否至少有一个为”李白“boolean b = PersonService.getPersons().stream().anyMatch(person -> person.getName().equals("李白"));System.o