java IntStream并行reduce

Vij*_*abu -3 java parallel-processing stream parallelstream

并行运行时 a==b 为何为 false 但与组合器一起使用时却有效?

public class test {

 public static int cal(final int i) {
       return 1;
 }
 
 public static void main(String args[]) {

   int a = IntStream.range(0, 3).reduce(0, (abc, cde) -> abc + cal(cde));
   int b = IntStream.range(0, 3).parallel().reduce(0, (abc, cde) -> abc + cal(cde));
   System.out.println(a == b); // false

   int c = List.of(0, 1, 2).stream().parallel().reduce(0, (abc, cde) -> abc + cal(cde), Integer::sum);
   System.out.println(a == c); // true
  }
}
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 5

传递给的函数reduce需要是关联的

累加器函数必须是关联函数。

你的不是。

当您违反合同时流的行为是未定义的。特别是,并行流可以将流分成任意块,并将它们组合成它们喜欢的任何分组,这仅适用于关联函数。非并行流通常以一种一致的顺序应用减速器,但这不受合同保证,并且可能会发生变化。