Java 1.8 Stream 流 Reduce 规约合并

更新时间 2023-07-25 10:50:31

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观

在 Java 1.8 中,Stream API 提供了 reduce() 方法用于将流中的元素进行归约操作reduce() 方法允许我们根据指定的操作,将流中的元素合并为一个结果。

本教程将深入介绍 Java 1.8 中的 Stream 的 reduce() 方法,并通过示例代码演示如何使用它。

reduce() 方法概览

在 Stream API 中,reduce() 方法用于将流中的元素进行归约操作。

Optional<T> reduce(BinaryOperator<T> accumulator)
T reduce(T identity, BinaryOperator<T> accumulator)
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner)
  • reduce(BinaryOperator<T> accumulator) 方法对流中的元素进行归约操作,并返回一个 Optional<T> 类型的结果。
  • reduce(T identity, BinaryOperator<T> accumulator) 方法对流中的元素进行归约操作,并返回一个 T 类型的结果。identity 是一个初始值,用于在流为空时返回。
  • reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner) 方法用于并行流的归约操作。identity 是一个初始值,combiner 用于合并并行计算的结果。

使用 reduce() 方法

让我们通过几个示例来说明如何使用 reduce() 方法。

示例 1:计算整数列表的总和

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 使用 reduce() 方法计算整数列表的总和
Optional<Integer> sum = numbers.stream()
                               .reduce((a, b) -> a + b);

if (sum.isPresent()) {
    System.out.println("Sum of numbers: " + sum.get()); // 输出 "Sum of numbers: 15"
}

在这个例子中,我们首先创建一个整数列表 numbers。然后,我们使用 stream() 方法将列表转换为 Stream 对象,再使用 reduce() 方法对整数列表进行归约操作,将所有元素相加并得到一个 Optional<Integer> 类型的结果。

示例 2:计算整数列表的乘积

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 使用 reduce() 方法计算整数列表的乘积
int product = numbers.stream()
                     .reduce(1, (a, b) -> a * b);

System.out.println("Product of numbers: " + product); // 输出 "Product of numbers: 120"

在这个例子中,我们使用 stream() 方法将列表转换为 Stream 对象,再使用 reduce() 方法对整数列表进行归约操作,将所有元素相乘并得到一个 int 类型的结果。注意,在这个示例中我们使用了初始值 1,用于在流为空时返回。

示例 3:使用并行流计算整数列表的总和

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// 使用并行流和 reduce() 方法计算整数列表的总和
int sum = numbers.parallelStream()
                 .reduce(0, (a, b) -> a + b, Integer::sum);

System.out.println("Sum of numbers with parallel stream: " + sum); // 输出 "Sum of numbers with parallel stream: 15"

在这个例子中,我们使用 parallelStream() 方法将列表转换为并行流,再使用 reduce() 方法对整数列表进行归约操作,并使用 Integer::sum 作为合并函数 combiner,将并行计算的结果合并。

总结

Java 1.8 中的 Stream API 提供了 reduce() 方法,用于将流中的元素进行归约操作。通过使用 reduce() 方法,你可以根据指定的操作将流中的元素合并为一个结果。