【发布时间】:2018-03-23 18:31:50
【问题描述】:
java.util.stream 包文档在归约上下文中给出了 identity 的定义:
identity值必须是组合器函数的身份。这意味着对于所有u,combiner.apply(identity, u)等于u。
Stream.reduce() 及其原始对应物提供了类似的定义。
据我了解,此定义对于支持并行流是必要的。例如,用于求和的非零种子值可能会乘以并行处理器的数量,从而无法预测地扭曲最终结果。
但是这个定义似乎比支持并行性所必需的更严格。为什么不要求idempotent 值x,使得combiner.apply(x, x) 等于x?这将保护像 Integer::sum、(a, b) -> a * b 和 String::concat 这样的函数不会在多个进程之间发生偏差,同时仍然允许使用任何具有幂等函数的种子,如 Math::max、(a, b) -> a | b 和 Sets::intersection。
我忽略的身份价值有什么独特的好处吗?
【问题讨论】:
标签: java parallel-processing java-stream reduction idempotent