1. 程式人生 > 其它 >Java Stream reduce(歸約函式)

Java Stream reduce(歸約函式)

        /**
         * 初始值的定義(Identity),累加器(Accumulator),組合器(Combiner)
         * Identity : 定義一個元素代表是歸併操作的初始值,如果Stream 是空的,也是Stream 的預設結果
         * Accumulator: 定義一個帶兩個引數的函式,第一個引數是上個歸併函式的返回值,第二個是Strem 中下一個元素。
         * Combiner: 呼叫一個函式來組合歸併操作的結果,當歸並是並行執行或者當累加器的函式和累加器的實現型別不匹配時才會呼叫此函式。
         */

        List<Integer> intList = Arrays.asList(1,2,3);
        Optional<Integer> result1=intList.stream().reduce(Integer::sum);
        System.out.println(result1);

        Integer result2=intList.stream().reduce(100, Integer::sum);
        System.out.println(result2);

        Integer result3=intList.parallelStream().reduce(100, Integer::sum);
        System.out.println(result3);

        Integer result4=intList.stream().reduce(100, Integer::sum, Integer::sum);
        System.out.println(result4);

        Integer result5=intList.parallelStream().reduce(100, Integer::sum, Integer::sum);
        System.out.println(result5);

        /**
         * 非是計算不對
         *
         * T reduce(T identity, BinaryOperator<T> accumulator);
         * identity必須是accumulator函式的一個identity,也就是說必須滿足:對於所有的t,都必須滿足 accumulator.apply(identity, t) == t
         *
         * <U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
         * identity需要滿足combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)
         */

        Integer result7=intList.stream().reduce(0, Integer::sum);
        System.out.println(result7);

        Integer result8=intList.parallelStream().reduce(0, Integer::sum);
        System.out.println(result8);

        Integer result9=intList.stream().reduce(0, Integer::sum, Integer::sum);
        System.out.println(result9);

        Integer result0=intList.parallelStream().reduce(0, Integer::sum, Integer::sum);
        System.out.println(result0);