2016-12-01 1 views
0

Ich verwende eine einfache Reduce-Methode mit drei Argumenten viz. Identität, Akkumulator und Kombinierer. Hier ist mein Code ...Java 8 Stream - Kombinierer der Reduce-Funktion wird nicht ausgeführt

Integer ageSumComb = persons 
      .stream() 
      .reduce(0, 
       (sum, p) -> { 
        System.out.println("Accumulator: Sum= "+ sum + " Person= " + p); 
        return sum += p.age; 
       }, 
       (sum1, sum2) -> { 
        System.out.format("Combiner: Sum1= " + sum1 + " Sum2= "+ sum2); 
        return sum1 + sum2; 

Aber was geschieht, ist der Combiner nicht ausgeführt zu werden. Ich verstehe nicht den Grund dafür. Hier ist meine Ausgabe ..

Accumulator: Sum= 0 Person= Max 
Accumulator: Sum= 18 Person= Peter 
Accumulator: Sum= 41 Person= Pamela 
Accumulator: Sum= 64 Person= David 
Accumulator: Sum= 76 Person= Pam 

Es gab jedoch kein Übersetzungsfehler und keine Ausnahme und meine Ausgabe ist genau richtig, das gleiche, was ich erwartet hatte. Aber warum wurde der Combiner nicht ausgeführt?

+3

Als Randnotiz verwenden werden, 'return sum + = p.age;' ist eine irreführende Aussage. Der '+ =' Operator modifiziert die Variable nach links, aber da 'sum' nur ein Lambda-Parameter ist, hat diese Änderung keine Auswirkung. Da nur die zurückgegebene Summe von Bedeutung ist, sollte die Anweisung "return sum + p.age;" lauten. Ohne die Druckanweisung könnte also der gesamte Lambda-Ausdruck "(sum, p) -> sum + p.age" lauten. Dennoch ist '.mapToInt (p -> p.age) .sum()' sauberer und effizienter als der Drei-Arg-'reduce'. – Holger

+5

"Der Combiner ist bei parallelen Reduktionen notwendig, bei denen die Eingabe partitioniert wird, eine partielle Akkumulation für jede Partition berechnet wird, und dann werden die partiellen Ergebnisse kombiniert, um ein Endergebnis zu erzeugen." Sie hätten diese Anweisung im Stream-Paket [javadoc] (https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html) finden können. –

Antwort

6

Combiner wird nur für einen parallelen Strom ausgeführt.

0

Sie müssen parallelStream statt stream verwenden, wenn Sie Kombinierer