为啥 Stream.reduce() javadoc 调用初始值 Identity?

Posted

技术标签:

【中文标题】为啥 Stream.reduce() javadoc 调用初始值 Identity?【英文标题】:Why Stream.reduce() javadoc calls initial value Identity?为什么 Stream.reduce() javadoc 调用初始值 Identity? 【发布时间】:2021-07-04 03:59:20 【问题描述】:

我总是对JavaDoc of reduce() 有点困惑。它调用初始值Identity

当我阅读Lodash 文档时,我更加困惑:

条款似乎颠倒了。标识不是初始值,而是每次迭代要调用的函数。而累加器就是初始值:

集合(数组|对象):要迭代的集合。[iteratee=_.identity](函数):每次迭代调用的函数。 [累加器] (*):初始值。

javascriptArray.prototype.reduce() 的文档似乎更简单。它调用初始值:initialValue

initialValue 被称为Identity 以及为什么Lodash reduce() 和Java reduce() 有这种命名冲突是有原因的吗?

【问题讨论】:

术语很好。它指的是identity element。 关于 Lodash 文档:不,该函数不称为“identity”,而是称为“iteratee”。 'iteratee' 函数有一个默认值,即身份函数(一个只返回传递给它的任何内容的函数)。 @Jesper 确实我没有注意到这一点。不过我还有一个黑点。在 lodash 中,初始值称为累加器。是否有一个原因?在 java 中,累加器是为每个元素调用的函数。 @MarinosAn accumulator 是您在操作之间传输的名称。您一次累积结果。 Java 使用该名称作为操作的双功能。 Lodash 使用该名称作为应用函数的结果——你继承的东西。它们都不是真正的错误——在这两种情况下,它都与继续操作和延续到下一个操作有关。双功能有时也称为 reducorreducer 【参考方案1】:

Array.prototype.reduce()不支持并行处理,所以该值是真正的单个初始值

Java 的Stream.reduce() 支持并行处理,因此该值可能会被多次使用,作为每个线程中的初始值,因此必须是中性,例如加0或乘1。这样的中性值称为身份值

正如Wikipedia 所说:

在数学中,恒等元素,或中性元素,是相对于该集合上的二元运算的集合的一种特殊类型的元素,它留下任何集合的元素与它结合时不变。这个概念用于代数结构,例如群和环。术语 identity element 通常缩写为 identity(如加法身份和乘法身份的情况),当没有混淆的可能性时,但身份隐含地取决于与之关联的二元运算。

【讨论】:

以上是关于为啥 Stream.reduce() javadoc 调用初始值 Identity?的主要内容,如果未能解决你的问题,请参考以下文章

stream reduce 执行源码简易分析

Java8 中reduce的基本使用

Java Stream Reduce 对象数组

Stream.reduce()用法详细解析

Java8:HashMap<X, Y> 到 HashMap<X, Z> 使用 Stream / Map-Reduce / Collector

获取流的最后一个元素的最有效方法