A execução sequencial e paralela dos fluxos Java8 produz resultados diferentes?
Executando o seguinte exemplo de fluxo no Java8:
System.out.println(Stream
.of("a", "b", "c", "d", "e", "f")
.reduce("", (s1, s2) -> s1 + "/" + s2)
);
rendimentos:
/a/b/c/d/e/f
O que é claro - não é surpresa. Devido ahttp://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html não importa se o fluxo é executado sequencialmente ou em paralelo:
Exceto para operações identificadas como explicitamente não determinísticas, como findAny (), se um fluxo é executado sequencialmente ou em paralelo não deve alterar o resultado da computação.
Até onde seireduce()
é determinístico e(s1, s2) -> s1 + "/" + s2
é associativo, de modo que adicionarparallel()
deve produzir o mesmo resultado:
System.out.println(Stream
.of("a", "b", "c", "d", "e", "f")
.parallel()
.reduce("", (s1, s2) -> s1 + "/" + s2)
);
No entanto, o resultado na minha máquina é:
/a//b//c//d//e//f
O que há de errado aqui?
BTW: usando (o preferido).collect(Collectors.joining("/"))
ao invés dereduce(...)
produz o mesmo resultadoa/b/c/d/e/f
para execução sequencial e paralela.
Detalhes da JVM:
java.specification.version: 1.8
java.version: 1.8.0_31
java.vm.version: 25.31-b07
java.runtime.version: 1.8.0_31-b13