2019-02-11——Java8 Stream reduce

对reduce的理解

reduce 操作可以实现从Stream中生成一个值,其生成的值不是随意的,是根据指定的计算模型。比如,之前提到count、min和max方法,因为常用而被纳入标准库中。事实上,这些方法都是reduce操作。

reduce重载

reduce方法有三个override的方法:

  • 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);
  1. 第一个重载函数的入参是一个BinaryOperator的函数式接口(该函数式接口接收两个T类型的参数并返回T类型)。该方法返回的是一个Optional类型的值。
Stream.of(1, 2, 3, 4).reduce((item,next)->item+next);
  1. 第二个重载函数的入参是一个T类型的对象和一个BinaryOperator的函数式接口,该方法返回的是一个T类型的对象。与第一个方法不同的是其会接受一个identity参数,用来指定Stream循环的初始值。如果Stream为空,就直接返回该值。另一方面,该方法不会返回Optional,因为该方法不会出现null。
Stream.of(1, 2, 3, 4).reduce(0,(item,next)->item+next);

3.第三个重载函数的入参有三个,第一个入参是一个U类型(泛型)的对象,第二个入参是一个BiFunction的函数式接口,第三个入参是一个BinaryOperator的函数式接口。
根据官方的文档

U result = identity;
for (T element : this stream)
    result = accumulator.apply(result, element)
return result;

  • 第一个参数传递要返回的对象;
  • 第二个参数是累加器accumulator,stream中的元素会迭代执行该累加器;
  • 第三个元素是组合器combiner,Stream是支持并发操作的,为了避免竞争,对于reduce线程都会有独立的result,combiner的作用在于合并每个线程的result得到最终结果。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容