Muss die Identität bei der Stream-Reduction-Methode immer 0 für die Summe und 1 für die Multiplikation sein?

Ich fahre mit dem Lernen von Java 8 fort.

Ich habe interessantes Verhalten gefunden:

lets siehe Codebeispiel:

// identity value and accumulator and combiner
        Integer summaryAge = Person.getPersons().stream()
                //.parallel()  //will return surprising result
                .reduce(1, (intermediateResult, p) -> intermediateResult + p.age,
                        (ir1, ir2) -> ir1 + ir2);
        System.out.println(summaryAge);

und Modellklasse:

public class Person {

    String name;

    Integer age;
    ///...

    public static Collection<Person> getPersons() {
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("Vasya", 12));
        persons.add(new Person("Petya", 32));
        persons.add(new Person("Serj", 10));
        persons.add(new Person("Onotole", 18));
        return persons;
   }
}

12 + 32 + 10 + 18 = 72
Für sequentielle Streams gibt dieser Code immer 73 (72 + 1) zurück, für parallele Streams jedoch immer 76 (72 + 4 * 1). 4-Stream-Elemente zählen.

Als ich dieses Ergebnis sah, fand ich es seltsam, dass parallele Streams und sequentielle Streams unterschiedliche Ergebnisse liefern.

Bin ich irgendwo einen Vertrag gebrochen?

P.S.

Für mich ist 73 Ergebnis aber 76 erwartet - nicht.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage