Запуск следующего примера потока в Java8:
System.out.println(Stream
.of("a", "b", "c", "d", "e", "f")
.reduce("", (s1, s2) -> s1 + "/" + s2)
);
дает:
/a/b/c/d/e/f
Что, конечно, не удивительно. Из-за http://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html не имеет значения, выполняется ли поток последовательно или параллельно:
За исключением операций, идентифицированных как явно недетерминированные, например findAny(), поток, выполняемый последовательно или параллельно, не должен изменять результат вычисления.
AFAIK reduce()
является детерминированным, а (s1, s2) -> s1 + "/" + s2
ассоциативным, поэтому добавление parallel()
должно давать тот же результат:
System.out.println(Stream
.of("a", "b", "c", "d", "e", "f")
.parallel()
.reduce("", (s1, s2) -> s1 + "/" + s2)
);
Однако результат на моей машине:
/a//b//c//d//e//f
Что здесь не так?
BTW: использование (предпочтительный) .collect(Collectors.joining("/"))
вместо reduce(...)
дает тот же результат a/b/c/d/e/f
для последовательного и параллельного выполнения.
Подробности 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