java8 srteam接口終端操作reduce操作

對於中間操作和終端操作的定義,請看《JAVA8 stream接口 中間操作和終端操作》,這篇主要講述的是stream的reduce操作,

reduce 是一種歸約操作,將流歸約成一個值的操作叫做歸約操作,用函數式編程語言的術語來說,這種稱爲摺疊(fold);

我們先看下函數的定義

T reduce(T identity, BinaryOperator<T> accumulator);
 
    Optional<T> reduce(BinaryOperator<T> accumulator);
 
    <U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);

接口對應的實現如下:

@Override
    public final P_OUT reduce(final P_OUT identity, final BinaryOperator<P_OUT> accumulator) {
        return evaluate(ReduceOps.makeRef(identity, accumulator, accumulator));
    }
 
    @Override
    public final Optional<P_OUT> reduce(BinaryOperator<P_OUT> accumulator) {
        return evaluate(ReduceOps.makeRef(accumulator));
    }
 
    @Override
    public final <R> R reduce(R identity, BiFunction<R, ? super P_OUT, R> accumulator, BinaryOperator<R> combiner) {
        return evaluate(ReduceOps.makeRef(identity, accumulator, combiner));
    }

可以看到,第一個和第三個,是一個重載方法,調用的同一個實現;下面,我們看下具體的小案例

 
我們使用無限流,生成了1-10的數字的list,關於無限流的解釋,以及流的創建的方式,可以 參看《java8 Stream-創建流的幾種方式》;

在java8之前,我們對數據求和的,是需要對list進行遍歷,然後累加求和的;在案例中,變量aa就是對list遍歷累加求和的出處理;從第二段代碼中開始,就是java8中的求和方式

T reduce(T identity, BinaryOperator<T> accumulator);
這個函數,接受2個參數,第一個表示初始值,第二個值,傳入的是一個函數式接口BinaryOperator,這個接口繼承BiFunction;計算的表達式的規則;

List<Integer> numbers = Stream.iterate(1, x -> x + 1).limit(10).collect(Collectors.toList());
        Integer aa = 0;
        for (Integer i : numbers) {
            aa += i;
        }
        Integer dd = numbers.stream().reduce(0, (a, b) -> a + b, (a, b) -> a - b);
        Optional<Integer> dd1 = numbers.stream().reduce((a, b) -> a + b);
        System.out.println(aa);
        System.out.println(dd);
        System.out.println(dd1.get());

Optional<T> reduce(BinaryOperator<T> accumulator);
這個接口。只用傳入計算規則,初始值是list的第一個參數,返回的optional對象,預防list裏,全部是null;

<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);


關於這個三個參數的接口,在《java8實戰》這本書中,沒有做介紹。我也不是特別理解,查閱過一些資料,在多線程中使用的,具體感興趣的,可以參考《 java8中3個參數的reduce方法怎麼理解?》

 

1.lambda表達式
《java8 Lambda表達式簡介》

《java8 lambda表達式,方法的引用以及構造器的引用》

2.函數式接口
《java8 函數式接口簡介》

《JAVA8 Function接口以及同類型的特化的接口》

《JAVA8 Consumer接口》

《JAVA8 Supplier接口》

《JAVA8 UnaryOperator接口》

《JAVA8 BiConsumer 接口》

3.stream接口操作

《java8 Stream接口簡介》

《 java8 Stream-創建流的幾種方式》

《JAVA8 stream接口 中間操作和終端操作》

《JAVA8 Stream接口,map操作,filter操作,flatMap操作》

《JAVA8 stream接口 distinct,sorted,peek,limit,skip》

《java8 stream接口 終端操作 forEachOrdered和forEach》

《java8 stream接口 終端操作 toArray操作》

《java8 stream接口 終端操作 min,max,findFirst,findAny操作》

《java8 stream接口終端操作 count,anyMatch,allMatch,noneMatch》

《java8 srteam接口終端操作reduce操作》

《java8 stream接口 終端操作 collect操作》

4.其他部分

《java8 Optional靜態類簡介,以及用法》

發佈了13 篇原創文章 · 獲贊 12 · 訪問量 4545
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章