java – 奇怪的“减少”方法组在JDK8批量收集操作库中

前端之家收集整理的这篇文章主要介绍了java – 奇怪的“减少”方法组在JDK8批量收集操作库中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么新的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(搜索聚合).

原文链接:https://www.f2er.com/java/123224.html

猜你在找的Java相关文章