Vla*_*eev 11 java collections lambda java-8
为什么新的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)
Run Code Online (Sandbox Code Playgroud)
但不是一个明显的方法,它对应于其他语言(例如Haskell )中的reduce
/ fold
functions foldl :: (a -> b -> a) -> a -> [b] -> a
,它们看起来像这样:
U reduce(U identity, BiFunction<U, ? super T, U> reducer)
Run Code Online (Sandbox Code Playgroud)
?
相反,有一个类似的方法有一个额外的combiner
参数.我甚至不确定如何使用它,因为我链接到上面的API文档在示例中没有使用此参数,它只提到了它所需的属性.
为什么JDK8方法是这样制作的,我如何fold
用它们模拟标准行为?
axe*_*l22 11
类似reduce
数据并行操作用作数据集(例如元素数组)上的一般值聚合操作.您可以使用它们来实现总和.
其中,所述数据集的值被组合在一起(例如求和)的顺序没有指定,所以它们不对应于foldl
在Haskell发现或reduceLeft
/ foldLeft
Scala中找到.
combiner
当聚合的结果类型与元素的类型不同时,将使用第三行中的额外参数.在这些情况下,您必须指定如何将两个结果组合在一起.假设您想使用第三个reduce实现字符串中元音的计数.数据元素是字符,并reducer
指定字符和当前计数的组合方式:
(Integer count, Character c) -> if (isVowel(c)) count + 1 else count
Run Code Online (Sandbox Code Playgroud)
合并器只是一个总和:
(Integer count1, Integer count2) -> count1 + count2
Run Code Online (Sandbox Code Playgroud)
例如,Scala Parallel Collections已经有一段时间了(搜索aggregate
).