Xiaobaiはストリームで削減することを学びます

APIドキュメント

ストリームストリームはreduceメソッドをオーバーロードします。
ここに画像の説明を挿入

最初:

T reduce(T identity,BinaryOperator<T> accumulator)

コードを変更して、各パラメーターの意味を確認してみましょう。

追加

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        List<Integer> numList = Arrays.asList(1,2,3,4,5);
        int result = numList.stream().reduce(0,(a,b) ->  a + b );
        System.out.println(result);

    }
}
// 结果为:15

サブ:

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        List<Integer> numList = Arrays.asList(1,2,3,4,5);//Arrays的asList()方法 可以将 数组转为List
        int result = numList.stream().reduce(0,(a,b) ->  a - b );
        System.out.println(result);

    }
}
// 结果为:-15

私は持っています:

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        List<Integer> numList = Arrays.asList(1,2,3,4,5);//Arrays的asList()方法 可以将 数组转为List
        int result = numList.stream().reduce(0,(a,b) ->  a * b );
        System.out.println(result);

    }
}
// 结果为:0

ここで実行した結果は0です。これはなぜですか?
ここで、reduceの最初のパラメーターIDを1に変更してみてください。

 int result = numList.stream().reduce(1,(a,b) ->  a * b );
 //运行结果:120

identity = 2の場合:

 int result = numList.stream().reduce(2,(a,b) ->  a * b );
 //运行结果:240

式の最初のパラメーターを使用して初期値を指定している関連ブログを確認してください
240 = 2 1 2 3 4 * 5に相当します。

Div:

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        List<Integer> numList = Arrays.asList(1,2,3,4,5);//Arrays的asList()方法 可以将 数组转为List
        int result = numList.stream().reduce(120,(a,b) ->  a / b );
        System.out.println(result);

    }
}
// 结果为:1

このコードははっきりと見ることができます。

文字列の試行を追加

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        String str1 = "a";
        int ans = str1.chars().reduce('a', (a, b) -> a - b);
        System.out.println(ans);
    }
}
// 结果为:0

これがASCIIコード値の減算です。

XOR:

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        String str1 = "a";
        int ans = str1.chars().reduce('a', (a, b) -> a ^ b);
        System.out.println(ans);
    }
}
// 结果为:0

2番目のタイプ:

Optional<T> reduce(BinaryOperator<T> accumulator)

その後、試してみてください、

追加

List<Integer> numList = Arrays.asList(1,2,3,4,5);
int result = numList.stream().reduce((a,b) -> a + b ).get();
System.out.println(result);
//运行结果:15

私は持っています

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        List<Integer> numList = Arrays.asList(1,2,3,4,5);
        int result = numList.stream().reduce((a,b) -> a * b ).get();
        System.out.println(result);
    }
}
// 结果为:120

最初との違いはここでの戻り値であり、getで取得する必要があります。

別のコードとその実行結果を見てみましょう。

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        List<Integer> numList = Arrays.asList(1,2,3,4,5);
        int result = numList.stream().reduce((a,b) -> {
    
    
            System.out.println("a=" + a + ",b=" + b);
            return a + b;
        } ).get();
    }
}

ここに画像の説明を挿入
ランバダ式のパラメータは、式の実行結果のキャッシュです。つまり、今回の式の実行結果は、次の実行のパラメータとして使用され、2番目のパラメータbは、順番にストリームします。式が初めて実行される場合、aはストリームの最初の要素です。

3番目のタイプ:

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

引き続き試してください:

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        List<Integer> numList = Arrays.asList(Integer.MAX_VALUE,Integer.MAX_VALUE);
        System.out.println(numList);
        long result = numList.stream().reduce(0L,(a,b) ->  a + b, (a,b)-> 0L );
        System.out.println(result);
    }
}

运行结果:
[2147483647, 2147483647]
4294967294

これは最初の2つの欠点を補うことがわかります。それらの計算結果はストリーム内の要素タイプと同じである必要があり、3番目は必須ではありません。

その他のアプリケーション:int型のArrayListをString型のArrayListに変換します

public class Test1 {
    
    
    public static void main(String[] args) {
    
    
        List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5, 6);
        ArrayList<String> result = numList.stream().reduce(new ArrayList<String>(), (a, b) -> {
    
    
            a.add("element-" + Integer.toString(b));
            return a;
        }, (a, b) -> null);
        System.out.println(result);
    }
}
运行结果:
[element-1, element-2, element-3, element-4, element-5, element-6]

ここで3つ目はあまり試さないでください。興味があれば、試してみてください。

おすすめ

転載: blog.csdn.net/weixin_45532227/article/details/111386705
おすすめ