java-stream - 组合器永远不会在归约操作中被调用(但是强制性的)
问题描述
我试图弄清楚累加器和组合器在reduce
流操作中的作用。
List<User> users = Arrays.asList(new User("John", 30), new User("Julie", 35));
int result = users.stream()
.reduce(0,
(partialAgeResult, user) -> {
// accumulator is called twice
System.out.println(MessageFormat.format("partialAgeResult {0}, user {1}", partialAgeResult, user));
return partialAgeResult + user.getAge();
},
(integer, integer2) -> {
// combiner is never called
System.out.println(MessageFormat.format("integer {0}, integer2 {1}", integer, integer2));
return integer * integer2;
});
System.out.println(MessageFormat.format("Result is {0}", result));
我注意到组合器从未执行过,结果为 65。如果我使用users.parallelStream()
组合器,则执行一次,结果为 1050。
为什么stream
会parallelStream
产生不同的结果?我没有看到并行执行此操作的任何副作用。
简单流版本中组合器的目的是什么?
解决方案
问题就在这里。您是在组合器中相乘而不是相加。
(integer, integer2) -> {
// combiner is never called
System.out.println(MessageFormat.format("integer {0}, integer2 {1}", integer, integer2));
return integer * integer2; //<----- Should be addition
});
组合器用于适当地组合并行操作的各个部分,因为这些操作可以在原始流的各个“片段”上独立执行。
一个简单的例子是对元素列表求和。您可以在并行操作中获得各种部分和,因此您需要在组合器中对部分和求和以获得总和(您可以自己尝试查看的一个很好的练习)。
推荐阅读
- javascript - 尝试在 html 中每 3 秒检查一次输入单选按钮
- python-3.x - 如何保存我从 exec 函数获得的 cmd?
- python - 实现 Soundex 编码算法
- logic - 什么是某些和所有逻辑的逻辑表?
- django - 我可以简单地删除迁移 0001_initial.py 但不建议删除,那么如何在不删除迁移的情况下修复这个
- python - 如何在 python 中逐步计算罚款?
- python - 如何在 Keras 中作为数组推断后获取输出
- python - 在二维直方图中的点之间画一条线
- flutter - 在flutter中使用table_calendar自动滚动到今天的日期
- c - 在 C 中读取多个字符串并在多个情况下浮动