2016-10-05 19 views
3

コレクションを使用するときにforEachコールの前にストリーム/パラレルストリームを挿入する理由はありますか?Java 8のコレクションとストリーム/ forEach

例:

Collection<Object> foo; 
foo.forEach(); // Goes through every item in foo 
foo.stream().forEach(); // Does stream make a difference here 
foo.parallelStream().forEach(); // Does this make a difference here? 

おかげ

+1

forEachは、 'parallelStream()'または 'parallel()'を使用する場合にのみ、並列で呼び出されます。これを行う場合は、コンシューマが何も変更しないか、スレッドセーフであることを確認する必要があります。 –

+2

ストリーム上の 'forEach'は、コレクション上の' forEach'とは異なり、セマンティクスが異なります。要素の順序を維持することは保証されず、パラレルストリームの場合、同期を行わずにアクションが呼び出されます。 'forEachOrdered'は' Collection.forEach'によく似ていますが、他のストリーム操作がない場合は意味がありません。 – Holger

+0

もう1つの違いは、Collection.forEachは、基になるコレクションを変更することについてより寛容であるということです。 –

答えて

3
foo.forEach(); // Goes through every item in foo 
foo.stream().forEach(); // Does stream make a difference here 

地図やフィルタなどのストリーム操作が必要な場合を除き、無駄です。

foo.parallelStream().forEach(); 

これは、コンピュータの論理コアごとに新しいスレッドを生成してアイテムを計算します。この機能を使用するかどうかについては2回考えてください。ほとんどの場合、長時間実行される操作でのみ支払いが行われます。

ボトムライン:ストリームは、タイプAのコレクションをタイプBにマッピングするような、副作用なしに使用できれば本当に輝きます。ループはストリーム外のデータを変更する可能性が非常に高いです。

0

それは同じ仕事をしていませんが、しかし、パラダイムは完全に異なっています。

ストリームは、の機能プログラミングの一部であり、これはあなたが何をすべきかの観点から考えることを可能にします。

抽象的に聞こえるかもしれませんが、実際には理にかなっています。基本的には、反復ではなく操作に重点を置いています。もちろん、stream()はフィルタ、マップ、リダクションなどの追加機能を提供します。

parallelStreamを使用すると、すべてのコアを使用できます。これは非常にクールです。余分なコード行。

+0

それはちょっと私が求めていたものです。私が明示的にparallelStream()と言うと、パフォーマンスの違いがあるのでしょうか、コレクションがForEachを呼び出すときに解釈されますか? – ekjcfn3902039

関連する問題