java concurrent 作者_java8学习之groupingByConcurrent与partioningBy源码分析

在上一次【http://www.cnblogs.com/webor2006/p/8387656.html】中对于Collectors.groupingBy()方法进行了完整的分析之后,接着继续来分析一下Collectors其它跟它类似的方法:groupingByConcurrent()、partioningBy(),

groupingByConcurrent():

这个方法在分析最复杂的groupingBy()时在其javadoc上提到过,如下:

f8579c628003375d18b8909867e9b1ad.png

而跟groupingBy()方法类似,Collectors也提供了三个重载的方法,如下:

52c83c168cc907b70f3f4c46ca19d531.png

所以分析也是从简到难顺序进行,首先先看一下最简单的:

b2b94eead88af902f97f8be26a178527.png

首先先简单读一下它的javadoc:

c8b1bf6511d962063415d37932417c40.png

43c37bf3fb74144e29f65c05eb2b4b54.png

接着看一下它的具体实现:

04ec8baabb5f16e61c335a31099bc42c.png

3957e1ac410e2f132d53476940ecbbe1.png

接着它调用了另外一个重载的方法,跟groupingBy类似,最终会调用一个最复杂的,如下:

0ad4714f10c6ecdecfcd1b8a5498e9b0.png

其代码的实现跟groupingBy基本雷同,相同的部份这里就不多说了,只看不同的:

106fd0003264727be7836431b89c815d.png

这就意味着对于不包含CONCURRENT的流如果调用groupingByConcurrent()方法也不会出错,因为从实现中也发现它会对结果容器进行同步处理;而反过来,如果对于一个并行流来说也没有提供CONCURRENT特性,此时多个线程就对应多个中间结果容器,这时也是对结果进行累加,也没啥问题。

partioningBy():

跟分组相关的方法那就是分区啦,同样存在重载的方式,如下:

822df66702dc2f62ea11af1d39ac7e54.png

还是按易到难的顺序进行分析,先分析它:

dec807f2e33837fd55780573b3235847.png

而它的实现是调用了另外一个重载的partitioningBy()方法:

c0410406f73d01ddd3caecac29698c33.png

所以焦点转向这个复杂的partitioningBy()方法:

ba071a62d88fc1648bde2fc8f16a0629.png

接着再看一下方法的具体实现,其大体过程跟咱们之前分析的groupingBy()方法基本类似,下面开始:

592fb113420f3c641af15fcea8072898.png

然后再依据下游的这个累加器生成新的累加器,具体细节如下:

e9adafa8e6e7071a181f183544f4f402.png

cd5b0a584f7d96386ddf7cdfd3496ada.png

那为啥有了Map结构还得自己封装一个这样的内部类呢?很明显就是为了应用于咱们这个只有两组的特殊情况而生的嘛。

871f8693561ca0d6217781824defb9c9.png

接着再根据下游收集器的combiner()对象再生成一个新的合并对象,如下:

c2628a441b66c103f0da12c04f4e9811.png

最后再根据下游收集器supplier再生成一个新的supplier,如下:

b6ba468d0b74b58e1e728fefbe7322b6.png

接下来则就是实例化CollectorImpl对象,当然也是根据下游收集器的特性来进行的,如下:

86f0bf9bd0027a8cf23bd5518761f256.png

3fc48f26697a0ceff7e6da7b220f4af3.png

4bf7eb82daccc637d373a8de193b1016.png

bba784cab70d5527b2f378c4c6decb5e.png

4912afe8f920658a61a2c6e5eec42246.png

至此,partitioningBy()方法就已经分析完啦,当然Collectors中的所有方法的实现基本上都已经完全读完了,通过读这些源码发现对于之前在学习之初学习的各种函数式接口、Lambda表达式的这些基础知识是何等的重要,基本上每个方法的实现都脱离不开这些基础知识,另外能过源码的认识也让咱们学得更加扎实。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值