【发布时间】:2019-09-22 00:29:28
【问题描述】:
我试图了解reduce() 方法在java-8 中是如何工作的。
例如我有这个代码:
public class App {
public static void main(String[] args) {
String[] arr = {"lorem", "ipsum", "sit", "amet"};
List<String> strs = Arrays.asList(arr);
int ijk = strs.stream().reduce(0,
(a, b) -> {
System.out.println("Accumulator, a = " + a + ", b = " + b);
return a + b.length();
},
(a, b) -> {
System.out.println("Combiner");
return a * b;
});
System.out.println(ijk);
}
}
输出是这样的:
Accumulator, a = 0, b = lorem
Accumulator, a = 5, b = ipsum
Accumulator, a = 10, b = sit
Accumulator, a = 13, b = amet
17
它是这些字符串长度的总和。而且我看到没有访问组合器,所以它不会乘以数字,它只会添加数字。
但如果我将stream 替换为parallelStream:
int ijk = strs.parallelStream().reduce(0,
(a, b) -> {
System.out.println("Accumulator, a = " + a + ", b = " + b);
return a + b.length();
},
(a, b) -> {
System.out.println("Combiner");
return a * b;
});
System.out.println(ijk);
这是输出:
Accumulator, a = 0, b = ipsum
Accumulator, a = 0, b = lorem
Accumulator, a = 0, b = sit
Combiner
Accumulator, a = 0, b = amet
Combiner
Combiner
300
我看到累加器和组合器都被访问了,但只有乘法是返回的。那么总和会发生什么?
【问题讨论】:
-
combiner仅用于并行流。还请仔细阅读reduce的文档,您不能在accumulator中进行求和,在combiner中进行乘法运算并期望得到有意义的结果
标签: java-8 java java-8 java-stream reduce