В методе 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 - нет.