2016-05-04 22 views
0

集計関数を使用する理由はわかりません。 つまり、集計関数はパフォーマンスを向上させる場合には実行を並列化すると考えられます。あなたの代わりに(ストリーム)parallelStreamを(使用しない場合集計関数

https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html

しかし、それは真実ではありません、ドキュメントによると、コードは、私はそう なぜべき、)平行ではありません何もうまくいかない場合は、stream()を使用します。

これらのコードは同じではありませんか?

//it is not parallel 
listOfIntegers.stream() 
      .forEach(e -> System.out.print(e+" ")); 

そして

//it is parallel 
listOfIntegers.parallelStream() 
      .forEach(e -> System.out.print(e+" ")); 
+1

あなたは「集計」機能とは何を意味するのですか?考えますかストリームの使用法? –

+1

ステートメントでラムダ式を使用しています。集計関数としてmap、filter、reduceを意味しますか? – Supahupe

+1

'forEach'は集約関数ではありません。それに加えて、あなたの例では、 'parallel()'の代わりに 'stream()'を使いたいと思う可能性が最も高いのは、ほとんどの場合、 'stream()'が速くなるからです。 – Holger

答えて

2

あなたがstreamを使用する場合はparallelStreamを使用する場合は、あなたのデータが順にプロセスではないかもしれませんが、あなたのリスト内のすべてのデータが、順番に処理されます。

は方法

static void test(Integer i){ 
     try { 
      Thread.sleep((long) (1000*Math.random())); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println(i); 
    } 

parallelStreamを使用して、このメソッドからの出力を比較し、stream

+0

'List.Stream()'がデータを順番に処理するという事実は、 'list'の内部については' stream() 'の振る舞いよりも詳しく述べています。たとえば、「Set」は、特定の順序でストリームをフィードします。 'forEach()'は定義上ストリームの順序を乱すので、要素が順番に処理されることを期待する 'List'動作の実装の詳細を決して考慮してはいけません。 'forEachOrdered'を使用するべきです。' forEach'では意図的に順序付けしたままにするべきではありません。 'stream()'と 'parallelStream()'の両方で動作します。 –