为什么在java-8流中没有执行合并器函数减少操作?

参见英文答案 > Java 8 Stream – Reduce function’s combiner not getting executed                                     2个
我试图了解流中的reduce方法是如何工作的.

Stream.of(1,2,3,4,5,6,7).reduce(new ArrayList<>(),(List<Integer> l,Integer a) -> {l.add(a);return l;},(List<Integer> l1,List<Integer> l2) -> {
System.out.println("l1 is" + l1 + "l2 is " + l2);
l1.addAll(l2);
return l1;
}).forEach(System.out::println);

System.out.println(“l1是”l1“l2是”l2“)行永远不会打印出来.
我可以理解发生了什么(List< Integer> l,Integer a) – > {l.add(a); return l;}
有人可以解释为什么不打印?
java docs表示组合两个值的函数,它必须与累加器函数兼容

谢谢,
阿马尔

解决方法

它仅在流并行时被调用.在这种情况下,流值被分成两半(递归地),每一半被缩减为一个列表,然后必须将两个列表组合在一起.

请注意,减少不应该改变作为参数接收的值(在本例中为列表).它应该返回一个新值.在这种情况下,这是一个可变的减少(即collect())是一个更好的选择.

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...