为什么新的JDK8
Stream
类仅包含以下reduce方法:
T reduce(BinaryOperator<T> reducer) T reduce(T identity,BinaryOperator<T> reducer) U reduce(U identity,BiFunction<U,? super T,U> reducer,BinaryOperator<U> combiner)
但不是一个明显的方法,对应于在其他语言(例如Haskell foldl ::(a – > b – > a) – > a – > [b] – a)中发现的缩减/折叠功能,可能看起来像这样:
U reduce(U identity,U> reducer)
?
相反,有一个类似的方法,它具有一个额外的组合器参数.我甚至不知道如何使用它,因为我链接到上面的API文档在示例中不使用此参数,它只提及其所需的属性.
为什么JDK8方法是这样做的,我如何模仿标准的折叠行为?
解决方法
类似缩减的数据并行操作用作数据集(例如元素阵列)上的一般值聚合操作.您可以使用它们来实现,例如,总和.
没有指定数据集的值组合在一起(例如求和)的顺序,因此它们不对应于在Haskell中找到的foldl或Scala中找到的reduceLeft / foldLeft.
当聚合的结果类型与元素的类型不同时,将使用第三行中的额外组合器参数.在这些情况下,您必须指定如何将两个结果组合在一起.
让我们说你想使用第三个reduce来实现字符串中的元音数量.数据元素是字符,reducer指定字符和当前计数的组合方式:
(Integer count,Character c) -> if (isVowel(c)) count + 1 else count
组合器只是一个总和:
(Integer count1,Integer count2) -> count1 + count2
例如,Scala Parallel Collections有这些for a while now(搜索聚合).