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には、二つのパラメータを受信して、結果を返します。以下のとおりです
Streamのデータと同じタイプの初期値identityを提供し、Streamのデータをアキュムレータaccumultorによって繰り返し計算し、Streamのデータと同じタイプの最終結果を得て、以下のように呼び出すことができる。
まず、BiFunctionの3つのタイプを見てみます。それぞれU、?super T、Uは、BiFunction関数式インターフェースapply方法を参照して定義されており、アキュムレータは、タイプを通じてUおよび?super Tの2つの入力値計算は、Uタイプの結果を返します。すなわち、このようなreduce方法は、Streamとは異なるデータタイプの初期値を提供し、アキュムレータ規則によってStream中のデータを反復計算し、最終的に同じ初期値と同じタイプの結果を得る。コールの例を見てください。
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に追加する。