Java 8 Stream reduce操作

5097 ワード

https://blog.csdn.net/u011213044/article/details/103997757
Reduceは、名前の通り減少するという意味で、指定された計算モデルに基づいてStreamの値を計算して最終結果を得るということです。前の記事でJava 8関数式プログラミングの中で簡単に紹介しましたが、Streamのcount、min、maxの方法の底にはreduceに依存しています。本記事ではJava 8 Stream reduceのいくつかの基本的な使い方を簡単に紹介します。
まず、Reduceの3つの形態を見てみます。S.N.    方法説明1    Optional reduce(BinaryOperator accumullator);       Stream中のデータはアキュムレータaccumultorによって反復計算され、最終的にOptionalオブジェクト2を得る。    T reduce(T identity、Binary Operator accumullator);       初期値identityを与え、アキュムレータaccumultor反復計算により、同じStreamのデータと同じタイプの結果を得る。      U reduce(U identity、BiFunction accumultor、BinaryOperator cobiner);       初期値identityを指定し、アキュムレータaccumultor反復計算により、identityタイプの結果を得て、3番目のパラメータを並列に使用します。     ストリーム時のマージ結果
1.Optional reduce(BinaryOperator accumullator);
まず、関数式インターフェースBinaryOperatorを見てください。BiFunctionに継承されています。Bifunctionには、二つのパラメータを受信して、結果を返します。以下のとおりです
    @FunctionalInterface
    public interface BinaryOperator extends BiFunction {
    }
     
    @FunctionalInterface
    public interface BiFunction {
        R apply(T t, U u);
    }
    ,reduce(BinaryOperator accumulator)             ,            ,      (reduce                      ),         。  reduce(BinaryOperator accumulator)        :
 @Test
    public void reduceTest() {
        Optional accResult = Stream.of(1, 2, 3, 4)
                .reduce((acc, item) -> {
                    System.out.println("acc : " + acc);
                    acc += item;
                    System.out.println("item: " + item);
                    System.out.println("acc+ : " + acc);
                    System.out.println("--------");
                    return acc;
                });
        System.out.println(accResult);
    }
実行結果:
    acc : 1
    item: 2
    acc+ : 3
    --------
    acc : 3
    item: 3
    acc+ : 6
    --------
    acc : 6
    item: 4
    acc+ : 10
    --------
    Optional[10]
2.T reduce(T identity、BinaryOperator accumullator);
Streamのデータと同じタイプの初期値identityを提供し、Streamのデータをアキュムレータaccumultorによって繰り返し計算し、Streamのデータと同じタイプの最終結果を得て、以下のように呼び出すことができる。
  @Test
    public void reduceTest1() {
        int accResult = Stream.of(1, 2, 3, 4)
                .reduce(100, (acc, item) -> {
                    System.out.println("acc : "  + acc);
                    acc += item;
                    System.out.println("item: " + item);
                    System.out.println("acc+ : "  + acc);
                    System.out.println("--------");
                    return acc;
                });
        System.out.println(accResult);
    }
    acc : 100
    item: 1
    acc+ : 101
    --------
    acc : 101
    item: 2
    acc+ : 103
    --------
    acc : 103
    item: 3
    acc+ : 106
    --------
    acc : 106
    item: 4
    acc+ : 110
    --------
    110
3.U reduce(U identity、BiFunction accumullator、Binary Operator cobiner);
まず、BiFunctionの3つのタイプを見てみます。それぞれU、?super T、Uは、BiFunction関数式インターフェースapply方法を参照して定義されており、アキュムレータは、タイプを通じてUおよび?super Tの2つの入力値計算は、Uタイプの結果を返します。すなわち、このようなreduce方法は、Streamとは異なるデータタイプの初期値を提供し、アキュムレータ規則によってStream中のデータを反復計算し、最終的に同じ初期値と同じタイプの結果を得る。コールの例を見てください。
   @Test
    public void reduceTest2() {
        ArrayList accResult_ = Stream.of(2, 3, 4)
                .reduce(Lists.newArrayList(1),
                        (acc, item) -> {
                            acc.add(item);
                            System.out.println("item: " + item);
                            System.out.println("acc+ : " + acc);
                            System.out.println("BiFunction");
                            return acc;
                        }, (acc, item) -> {
                            System.out.println("BinaryOperator");
                            acc.addAll(item);
                            System.out.println("item: " + item);
                            System.out.println("acc+ : " + acc);
                            System.out.println("--------");
                            return acc;
                        }
                );
        System.out.println("accResult_: " + accResult_);
    }
実行結果:
    item: 2
    acc+ : [1, 2]
    BiFunction
    item: 3
    acc+ : [1, 2, 3]
    BiFunction
    item: 4
    acc+ : [1, 2, 3, 4]
    BiFunction
    accResult_: [1, 2, 3, 4]
運転結果から、3番目のパラメータ定義のルールは実行されていないことが分かります。これは、reduceの3番目のパラメータが、parallel Streamのreduceを使用して動作する際に、各ストリームの結果を統合するので、本例ではstreamを使用するので、3番目のパラメータは機能しない。上記の例では、1つの要素1だけのarrayListが提供され、アキュムレータを介して反復して、stream中のデータをarrayListに追加する。