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つ目はあまり試さないでください。興味があれば、試してみてください。