Stream.reduce的学习

在深入讨论 Stream.reduce() 功能之前,让我们先了解几个概念

Identity : 定义一个元素代表是归并操作的初始值,如果Stream 是空的,也是Stream 的默认结果
Accumulator: 定义一个带两个参数的函数,第一个参数是上个归并函数的返回值,第二个是Strem 中下一个元素。
Combiner: 调用一个函数来组合归并操作的结果,当归并是并行执行或者当累加器的函数和累加器的实现类型不匹配时才会调用此函数。

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int result = numbers
  .stream()
  .reduce(0, (subtotal, element) -> subtotal + element);
assertThat(result).isEqualTo(21)

上面示例中,reduce 方法的第一个参数 0 是 identity ,此参数用来保存归并参数的初始值,当Stream 为空时也是默认的返回值。(subtotal, element) -> subtotal + element 是accumulator ,第一个参数是上次累计的和,第二个参数是数据流的下一个元素。为了使代码更简洁,我们可以用方法引用来代替 lambda 表达式。
当然,我们可以用reduce 方法处理其他类型的 stream,例如,可以操作一个 String 类型的数组,把数组的字符串进行拼接。

List<String> letters = Arrays.asList("a", "b", "c", "d", "e");
String result = letters
  .stream()
  .reduce("", (partialString, element) -> partialString + element);
assertThat(result).isEqualTo("abcde");

https://blog.csdn.net/lijingronghcit/article/details/108348728

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
stream().reduce的combiner是Java 8中新增的一个方法,它与传统的reduce方法版本略有不同。combiner相当于将并行流中的多个结果合并成最终结果的函数。 例如下面的代码: ``` List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); int sum = numbers.parallelStream().reduce(0, (a, b) -> a + b, (a, b) -> a + b); ``` 上述代码创建了一个包含1到6数字的List,然后将其转换为并行流。reduce()方法中的第一个参数是初始值,为0,第二个参数是要执行的操作(在这里是将两个参数相加),第三个参数则是一个用于合并结果的操作(在这里也是将两个参数相加)。 combiner在并行流中的使用非常重要,因为它能显著地提高程序的性能。在并行流执行reduce时,数据会被分成多个chunk并行处理,然后结果将被合并。combiner是合并这些中间结果的函数,因此需要具有结合律和交换律。 例如: ``` List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); int sum = numbers.parallelStream().reduce(0, (a, b) -> a + b, (a, b) -> { System.out.println("combiner: " + a + " + " + b + " = " + (a + b)); return a + b; }); ``` 上述代码将在执行并行求和时打印出与combiner相关的信息,我们可以看到combiner会将不同chunk处理得到的中间结果连续合并: ``` combiner: 10 + 15 = 25 combiner: 25 + 19 = 44 combiner: 29 + 44 = 73 ``` 在使用并行流时,我们需要注意一些细节问题,因为如果不进行正确的设置,结果很可能会出乎意料,这里只是大致说明其用法和原理,具体细节还需另行学习

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值