为啥 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](函数):每次迭代调用的函数。 [累加器] (*):初始值。
javascript 的Array.prototype.reduce()
的文档似乎更简单。它调用初始值:initialValue
。
initialValue 被称为Identity
以及为什么Lodash reduce()
和Java reduce()
有这种命名冲突是有原因的吗?
【问题讨论】:
术语很好。它指的是identity element。 关于 Lodash 文档:不,该函数不称为“identity”,而是称为“iteratee”。 'iteratee' 函数有一个默认值,即身份函数(一个只返回传递给它的任何内容的函数)。 @Jesper 确实我没有注意到这一点。不过我还有一个黑点。在 lodash 中,初始值称为累加器。是否有一个原因?在 java 中,累加器是为每个元素调用的函数。 @MarinosAn accumulator 是您在操作之间传输的名称。您一次累积结果。 Java 使用该名称作为操作的双功能。 Lodash 使用该名称作为应用函数的结果——你继承的东西。它们都不是真正的错误——在这两种情况下,它都与继续操作和延续到下一个操作有关。双功能有时也称为 reducor 或 reducer。 【参考方案1】:Array.prototype.reduce()
不支持并行处理,所以该值是真正的单个初始值。
Java 的Stream.reduce()
支持并行处理,因此该值可能会被多次使用,作为每个线程中的初始值,因此必须是中性,例如加0或乘1。这样的中性值称为身份值。
正如Wikipedia 所说:
在数学中,恒等元素,或中性元素,是相对于该集合上的二元运算的集合的一种特殊类型的元素,它留下任何集合的元素与它结合时不变。这个概念用于代数结构,例如群和环。术语 identity element 通常缩写为 identity(如加法身份和乘法身份的情况),当没有混淆的可能性时,但身份隐含地取决于与之关联的二元运算。
【讨论】:
以上是关于为啥 Stream.reduce() javadoc 调用初始值 Identity?的主要内容,如果未能解决你的问题,请参考以下文章
Java8:HashMap<X, Y> 到 HashMap<X, Z> 使用 Stream / Map-Reduce / Collector