对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);
- 第一个重载函数的入参是一个BinaryOperator的函数式接口(该函数式接口接收两个T类型的参数并返回T类型)。该方法返回的是一个Optional类型的值。
Stream.of(1, 2, 3, 4).reduce((item,next)->item+next);
- 第二个重载函数的入参是一个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得到最终结果。