【发布时间】:2020-05-01 22:23:12
【问题描述】:
以下是 Oracle Java 13 文档:
U reduce(U 恒等式,
双功能累加器,
BinaryOperator 组合器)
参数:
identity - 组合函数的标识值
累加器 - 一种关联的、无干扰的、无状态的函数,用于将附加元素合并到结果中
combiner - 一个关联的、无干扰的、无状态的函数,用于组合两个值,它必须与累加器函数兼容
https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/util/stream/Stream.html#reduce(U,java.util.function.BiFunction,java.util.function.BinaryOperator)
首先,我知道运算符的关联性意味着 (a op b) op c == a op (b op c)。
维基百科说关联属性是一些二元运算的属性。
二元运算的意思是 f:S × S → S。
这是我的问题:如果累加器函数的域不是 S x S 而是 S x T,那么累加器如何具有关联性?
例如,
int length = asList("str1", "str2").stream()
.reduce(0, (accumulatedInt, str ) -> accumulatedInt + str.length(),
(accumulatedInt, accumulatedInt2) -> accumulatedInt + accumulatedInt2);
在这种情况下,累加器是(accumulatedInt, str ) -> accumulatedInt + str.length(),它不是关联的。它采用两种不同类型的参数。怎么可能是(a op b)op c == a op(b op c)。 java文档中的“累加器必须是关联的”是什么意思?
【问题讨论】:
-
不,那不是组合器。它是累加器。
-
对不起,我的意思是一个蓄能器。我知道组合器必须是关联的。我编辑了。
-
Javadoc 中的累加器定义为:
BiFunction<U, ? super T, U> accumulator<? super T>接受 Parent 或 Grandparent,这是整数值作为您的身份U已定义为 Integer,因此后面的部分也被推断为整数. -
@Vishwa 示例代码中的累加器接受一个 int 和一个字符串,然后返回一个 int。所以它是 S X T → S,不是吗?
-
你说得对,associative 对 累加器 没有意义,因为 2 个输入的类型不同。您应该提交错误报告以修复 javadoc。
标签: java