跳转至

Java8 Stream API 概述

基本操作步骤

  1. 创建 Stream
  2. 中间操作
  3. 终止操作

1. 创建 Stream

1.1 通过 Collection

Collection 提供了两个方法:

  • stream() - 获取一个顺序流
  • parallelStream() - 获取一个并行流
// 获取顺序流
Stream<String> stream = list.stream();

// 获取并行流
Stream<String> parallelStream = list.parallelStream();

并行流:就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。

1.2 通过 Arrays

通过 Arrays 中的 stream() 获取一个数组流:

Integer[] nums = new Integer[10];
Stream<Integer> stream1 = Arrays.stream(nums);

1.3 通过 Stream.of()

通过 Stream 中静态方法 of() 创建:

Stream<Integer> stream2 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9);

1.4 创建无限流

  • 迭代方式
Stream<Integer> stream3 = Stream.iterate(0, x -> x + 3);
stream3.forEach(System.out::println);
  • 生成方式
Stream<Double> stream4 = Stream.generate(Math::random);
stream4.forEach(System.out::println);

2. 中间操作

[请看下一节:3. Java8 Stream 操作]

3. 终止操作

3.1 查找与匹配

方法 描述
allMatch 检查是否匹配所有元素
anyMatch 检查是否至少匹配一个元素
noneMatch 检查是否没有匹配的元素
findFirst 返回第一个元素
findAny 返回当前流中的任意元素
count 返回流中元素的总个数
max 返回流中最大值
min 返回流中最小值

示例代码

// allMatch——检查是否匹配所有元素
boolean match = emps.stream().allMatch(e -> e.getStatus().equals(Employee.Status.BUSY));

// anyMatch——检查是否至少匹配一个元素
boolean match1 = emps.stream().anyMatch(e -> e.getStatus().equals(Employee.Status.FREE));

// noneMatch——检查是否没有匹配的元素
boolean match3 = emps.stream().noneMatch(e -> e.getStatus().equals(Employee.Status.BUSY));

// findFirst——返回第一个元素
Optional<Employee> first = emps.stream().findFirst();
Employee employee = first.get();

// findAny——返回当前流中的任意元素
Optional<Employee> any = emps.stream().findAny();
Employee employee1 = any.get();

// count——返回流中元素的总个数
long count = emps.stream().count();

// max——返回流中最大值
Optional<Integer> max = emps.stream().map(Employee::getAge).max(Integer::compare);
Integer integer = max.get();

// min——返回流中最小值
emps.stream().map(Employee::getId).min(Integer::compare);

注意:流进行了终止操作后,不能再次使用。

3.2 归约

方法 描述
reduce(T identity, BinaryOperator operator) 可以将流中元素反复结合起来,得到一个值。返回 T
reduce(BinaryOperator operator) 可以将流中元素反复结合起来,得到一个值。返回 Optional

示例代码

// 基本用法
Optional<Integer> reduce = numList.stream().reduce((x, y) -> x + y);
int sum = reduce.get();
System.out.println(sum);

// 与 map 结合
Optional<Integer> reduce1 = emps.stream()
    .map(Employee::getAge)
    .reduce(Integer::max);
System.out.println(reduce1.get());