2015-07-21 8 views
5

ich nicht den Nutzen des dritten Parameter des folgenden Verfahrens verstehen:Über collect (Lieferant, Akkumulator, Kombinierer)

<R> R collect(Supplier<R> supplier, 
       BiConsumer<R,? super T> accumulator, 
       BiConsumer<R,R> combiner) 

von javaDoc:

Dies erzeugt ein Ergebnis gleichwertig zu:

R result = supplier.get(); 
for (T element : this stream) 
    accumulator.accept(result, element); 
return result; 

Wie Sie sehen können, wird der Parameter combiner nicht verwendet. Zum Beispiel werden die folgenden Zeichenfolgen in einer Arraylist akkumulieren:

List<String> asList = stringStream.collect(ArrayList::new, ArrayList::add, 
              ArrayList::addAll); 

aber ich erwartete dies:

List<String> asList = stringStream.collect(ArrayList::new, ArrayList::add); 

Antwort

10

Die combiner wird verwendet, wenn Ihre Stream parallel ist, da in diesem Fall mehrere Threads sammeln Elemente die Stream in Unterlisten der endgültigen Ausgabe ArrayList, und diese Unterlisten müssen kombiniert werden, um die endgültige ArrayList zu produzieren.

+0

Wenn parallel verarbeitet, wird die ursprüngliche Stream-Reihenfolge im Ergebnis nach dem Kombinieren nicht garantiert. Recht? – Chen

+0

@Chen Ich glaube das hängt davon ab, dass der Combiner an 'collect' übergeben wird. Der Combiner kann die ursprüngliche Reihenfolge beibehalten. – Eran