Java流减少功能。蓄电池的结合性

时间:2020-01-15 07:07:44

标签: java

以下是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文档“累加器必须具有关联性”是什么意思?

1 个答案:

答案 0 :(得分:2)

在这种reduce方法的情况下,accumulator的关联性可以用accumulatorcombiner函数(除了{值{1}}。

例如,假设您的identity具有元素t1,t2和t3。

您可以将t1和t2添加到中间结果中,然后将t3添加到该结果中-这相当于Stream

或者您可以将t2和t3添加到中间结果中,然后将t1添加到该结果中-这相当于(t1 op t2) op t3

关联性意味着两种情况下的最终结果必须相同。

要写这是累加器和合并器函数的术语,它看起来像这样(我不写显式方法调用,因为我认为这不太可读):

t1 op (t2 op t3)