加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:10:45 所属栏目:Java 来源:网络整理
导读:为什么新的JDK8 Stream 类仅包含以下reduce方法: T reduce(BinaryOperatorT reducer)T reduce(T identity,BinaryOperatorT reducer)U reduce(U identity,BiFunctionU,? super T,U reducer,BinaryOperatorU combiner) 但不是一个明显的方法,对应于在其他语言
为什么新的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(搜索聚合).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读