No método de redução de fluxo, a identidade deve sempre ser 0 para soma e 1 para multiplicação?
Prossigo o java 8 learning.
Eu encontrei um comportamento interessante:
vamos ver o exemplo de código:
// 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);
e classe de modelo:
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
Para fluxo sequencial, esse código retorna 73 (72 + 1) sempre, mas para paralelo retorna 76 (72 + 4 * 1) sempre. 4 - elementos de fluxo contam.
Quando vi esse resultado, achei estranho o fluxo paralelo e o fluxo sequencial retornarem resultados diferentes.
Eu quebrei contrato em algum lugar?
P.S.para mim 73 é resultado esperado, mas 76 - não.