以下是Oracle Java 13文档:
U reduce((U身份,
BiFunction蓄电池,
BinaryOperator组合器)
参数:
identity-组合器功能的标识值
累加器-一种关联,无干扰,无状态的函数,用于将一个附加元素合并到结果中
组合器-一种用于组合两个值的关联,无干扰,无状态的函数,必须与累加器函数兼容
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文档“累加器必须具有关联性”是什么意思?
答案 0 :(得分:2)
在这种reduce
方法的情况下,accumulator
的关联性可以用accumulator
和combiner
函数(除了{值{1}}。
例如,假设您的identity
具有元素t1,t2和t3。
您可以将t1和t2添加到中间结果中,然后将t3添加到该结果中-这相当于Stream
。
或者您可以将t2和t3添加到中间结果中,然后将t1添加到该结果中-这相当于(t1 op t2) op t3
。
关联性意味着两种情况下的最终结果必须相同。
要写这是累加器和合并器函数的术语,它看起来像这样(我不写显式方法调用,因为我认为这不太可读):
t1 op (t2 op t3)