【问题标题】:Java stream reduce function. Associativity of accumulatorJava 流减少功能。累加器的关联性
【发布时间】: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


【解决方案1】:

在这种reduce 方法的情况下,accumulator 的关联性可以用accumulatorcombiner 函数表示(除了identity 值)。

例如,假设您的 Stream 包含元素 t1、t2 和 t3。

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

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

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

要写这个是累加器和组合器函数的术语,它看起来像这样(我没有写显式的方法调用,因为在我看来这样可读性会降低):

((identity <accumulator> t1) <accumulator> t2) <accumulator> t3 ==
(identity <accumulator> t1) <combiner> ((identity <accumulator> t2) <accumulator> t3)

【讨论】:

  • 感谢您的回答。但这不是我想知道的。如果我可以灵活地解释“关联性”这个词,我同意在这种情况下它涉及combineraccumulator。但严格来说,除了“关联属性是某些二元运算的属性”之外,我找不到任何关联性的定义。甚至 oracle 文档也仅针对这种情况解释了关联性。编程中不允许灵活的、不基于定义的推理。
猜你喜欢
  • 2014-12-16
  • 2015-05-18
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2022-12-18
  • 2022-08-21
  • 2022-01-08
相关资源
最近更新 更多