2016-05-04 10 views
0

Ich weiß nicht, warum ich Aggregatfunktionen verwenden soll. Ich meine, es wird angenommen, dass eine Aggregatfunktion die Ausführung parallelisiert, wenn die Leistung verbessert wird.Aggregatfunktionen

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

Aber es ist nicht wahr, nach der Dokumentation, wird der Code nicht parallel sein, wenn Sie nicht über einen parallelStream() verwenden, anstatt Strom(), so Warum sollte ich Verwenden Sie einen Stream(), wenn nichts besser geht?

Sollten diese Codes nicht übereinstimmen?

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

Und

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

Was meinen Sie mit „Aggregat“ Funktionen

Methode betrachten

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); } 

und Ausgabe von diesem Verfahren vergleichen? Verwendung von Streams? –

+1

Sie verwenden Lambda-Ausdrücke in Ihren Anweisungen. Meinst du map, filter, reduziere als Aggregat-Funktionen? – Supahupe

+1

'forEach' ist keine Aggregatfunktion. Außerdem möchten Sie in Ihrem Beispiel wahrscheinlich 'stream()' anstelle von 'parallelStream()' verwenden, da der sequentielle 'stream()' in den meisten Fällen schneller ist. – Holger

Antwort

2

wenn Sie stream verwenden, werden alle Daten in der Liste werden in der Reihenfolge bearbeitet werden, während, wenn Sie parallelStream nutzen Ihre Daten nicht verarbeiten, um sein könnte. mit parallelStream und stream

+0

Die Tatsache, dass 'List.Stream()' Daten in der Reihenfolge verarbeitet, sagt mehr über die Interna der 'Liste' aus als das Verhalten von' stream() '. Ein 'Set' zum Beispiel speist einen Stream in keiner bestimmten Reihenfolge. 'forEach()' macht per definitionem den Stream ungeordnet, und man sollte sich niemals auf das Implementierungsdetail des 'List'-Verhaltens verlassen, um zu erwarten, dass Elemente in der Reihenfolge verarbeitet werden. Man sollte 'forEachOrdered', nicht' forEach' verwenden, um die Dinge absichtlich zu halten, und das funktioniert sowohl für 'stream()' als auch für 'parallelStream()' –