2017-12-07 7 views
1

誰か教えてくださいStreamの中間操作と端末操作の違いは何ですか?中間操作と端末操作の違いは何ですか?

Streamストリームを処理するためにパイプラインに結合されます。すべての操作は中間または終端のいずれかです。

+0

ストリームは、ターミナル操作がsum、toarrayなどのように呼び出され、フィルタが実際に動作するときに実際に何かを行います。マップは中間であり、恐らく二重です。 –

答えて

3

ストリームはいくつかの操作をサポートしており、これらの操作はintermediateterminal操作に分かれています。

この操作の違いは、端末操作が遅延している間に中間操作が遅延していることです。ストリーム上で中間操作を呼び出すと、操作はすぐに実行されません。この操作は、そのストリームで端末操作が呼び出された場合にのみ実行されます。ある意味では、中間操作が記憶され、端末操作が呼び出されるとすぐに呼び出されます。複数の中間操作を連鎖させることができ、いずれも端末操作を呼び出すまでは何も行いません。そのとき、以前に呼び出されたすべての中間操作が、端末操作とともに呼び出されます。

すべての中間操作は、ストリーム操作(連鎖可能)を返しますが、端末操作は返しません。中間動作は次のとおり

filter(Predicate<T>) 
map(Function<T>) 
flatmap(Function<T>) 
sorted(Comparator<T>) 
peek(Consumer<T>) 
distinct() 
limit(long n) 
skip(long n) 

ターミナル操作は、プリミティブ値、コレクション又は全く値として非ストリーム(連鎖することができない)結果を生成します。

ターミナルの操作は以下のとおりです。

forEach 
toArray 
reduce 
collect 
min 
max 
count 
anyMatch 
allMatch 
noneMatch 
findFirst  
findAny 

最終5短絡端末操作です。

+0

'limit()'と 'skip() int ' – Lino

+0

あなたはそうです。ただ私の答えを更新しました。ありがとう@Lino! –

+0

ありがとう.. @AlexMamoあなたの説明はかなりきれいです.. –

1

リストのストリームを収集する、または値のストリームを集めるなどの処理を終了する端末の意味。

新しい状態への移行のように中間は、端末操作への道

2

にあなたはおそらく、あなたがストリームを定義するとき、メソッドがちょうど全体のストリーム上の一つ一つと呼ばれていないことに気づいたが、むしろ彼らはストリームから各要素に対して何かを行います。これらのストリームを並列に実行できるようにするには、すべての要素に対して基本的にパイプライン全体があります。

複数のパイプラインを作成するために、Java 8以降ではbuilder patternが使用されています。すべての中間ステップで、フィルタまたはコンバータをスタックに追加します。そのスタックからパイプラインを生成するようにJavaに指示するには、終了手順を使用します。最後のステップは、すべての異なるパイプラインを組み合わせることです。通常は、定義された形式で値を返します。リストを作成することもできますが、要素ごとに関数を1回実行したり、結果をブール値または数値に減らすこともできます。

関連する問題