В методе Stream Reduce должны ли тождество всегда быть 0 для суммы и 1 для умножения?

Я продолжаю изучение Java 8.

Я нашел интересное поведение:

давайте посмотрим пример кода:

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

и модель класса:

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
Для последовательного потока этот код всегда возвращает 73 (72 + 1), но для параллельного всегда 76 (72 + 4 * 1). 4 - количество элементов потока.

Когда я увидел этот результат, я подумал, что странно, что параллельный поток и последовательные потоки возвращают разные результаты.

Я где-то нарушил контракт?

Постскриптум

для меня 73 - ожидаемый результат, а 76 - нет.

Ответы на вопрос(3)

Ваш ответ на вопрос