美文网首页技术栈
2019-02-11——Java8 Stream reduce

2019-02-11——Java8 Stream reduce

作者: 烟雨乱平生 | 来源:发表于2019-02-11 12:25 被阅读0次

    对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得到最终结果。

    相关文章

      网友评论

        本文标题:2019-02-11——Java8 Stream reduce

        本文链接:https://www.haomeiwen.com/subject/aexqeqtx.html