java8学习之groupingByConcurrent与partioningBy源码分析
在上一次【http://www.cnblogs.com/webor2006/p/8387656.html】中对于Collectors.groupingBy()方法进行了完整的分析之后,接着继续来分析一下Collectors其它跟它类似的方法:groupingByConcurrent()、partioningBy(),
groupingByConcurrent():
这个方法在分析最复杂的groupingBy()时在其javadoc上提到过,如下:

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

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

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


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


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

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

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

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

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

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

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

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


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

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

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

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





至此,partitioningBy()方法就已经分析完啦,当然Collectors中的所有方法的实现基本上都已经完全读完了,通过读这些源码发现对于之前在学习之初学习的各种函数式接口、Lambda表达式的这些基础知识是何等的重要,基本上每个方法的实现都脱离不开这些基础知识,另外能过源码的认识也让咱们学得更加扎实。
java8学习之groupingByConcurrent与partioningBy源码分析的更多相关文章
- java8学习之Collectors工厂类源码分析与实战
如上一节[http://www.cnblogs.com/webor2006/p/8360232.html]在结尾处谈到的,彻底理解了Collector收集器之后,有必要对其系统Collectors实现 ...
- Redis学习之zskiplist跳跃表源码分析
跳跃表的定义 跳跃表是一种有序数据结构,它通过在每个结点中维持多个指向其他结点的指针,从而达到快速访问其他结点的目的 跳跃表的结构 关于跳跃表的学习请参考:https://www.jianshu.co ...
- Nginx学习笔记(五) 源码分析&内存模块&内存对齐
Nginx源码分析&内存模块 今天总结了下C语言的内存分配问题,那么就看看Nginx的内存分配相关模型的具体实现.还有内存对齐的内容~~不懂的可以看看~~ src/os/unix/Ngx_al ...
- Nginx学习笔记(四) 源码分析&socket/UDP/shmem
源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_socket.h&Ngx_s ...
- Java显式锁学习总结之六:Condition源码分析
概述 先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停:等到线程B修改了条件condition,使con ...
- Python学习---Django的request.post源码分析
request.post源码分析: 可以看到传递json后会帮我们dumps处理一次最后一字节形式传递过去
- Java显式锁学习总结之五:ReentrantReadWriteLock源码分析
概述 我们在介绍AbstractQueuedSynchronizer的时候介绍过,AQS支持独占式同步状态获取/释放.共享式同步状态获取/释放两种模式,对应的典型应用分别是ReentrantLock和 ...
- Redis学习之ziplist压缩列表源码分析
一.压缩列表ziplist在redis中的应用 1.做列表键 当一个列表键只包含少量列表项,并且每个列表项要么是小整数,要么是短字符串,那么redis会使用压缩列表作为列表键的底层实现 2.哈希键 当 ...
- Redis学习之intset整数集合源码分析
1.整数集合:整数的集合,升序排序,无重复元素 2.整数集合intset是集合键的底层实现之一,当一个集合只包含整数值的元素,并且这个集合的元素数量不多时,redis会使用整数集合作为集合键的底层实现 ...
随机推荐
- linux常用命令(10)more命令
more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会 ...
- linux之文件查找find grep详解,以及压缩归档
.find linux里的实时查找工具,通过制定路径完成文件查找. find[options]...[查找路径] [查找条件] [处理动作] 查找路径:查找的位置,默认是当前文件夹. 查找条件:指定查 ...
- django 模板里面for循环和if常用的方法
django 模板里面for循环常用的方法 {% for %} 允许我们在一个序列上迭代.与Python的for 语句的情形类似,循环语法是 for X in Y ,Y是要迭代的序列而X是在每一个特定 ...
- docker 入门 命令
docker 命令 docker images 镜像列表 docker ps 服务列表 docker 隐藏打包文件 .dockerignore .git node_modules npm-debug. ...
- Java ——注释 命名
注释 1.类在每个类前面必须加上类注释,注释模板如下:/*** Copyright (C), 2006-2010, ChengDu Lovo info. Co., Ltd.* FileName: Te ...
- A = min(1, max(0, A))
Crop A into [0, 1]:
- DCN模型
1. DCN优点 使用Cross Network,在每一层都运用了Feature Crossing,高效学习高阶特征. 网络结构简单且高效 相比DNN,DCN的Logloss值更低,而且参数的数量少了 ...
- PHP xdebug 断点调试
转载自: https://blog.csdn.net/qq_32631847/article/details/82054011
- hue的优化
参考: 官网: https://docs.cloudera.com/documentation/enterprise/6/6.2/topics/hue_ref_arch.html 1/ 和开发沟通是否 ...
- max-http-header-size 引发的一起血案(附:查gc方法)
最近在做项目的时候发现其中一个服务出现了性能上的问题,项目启动后,出现内存溢出异常. 查看堆内存使用情况 分析然后找到占用空间的类,当时是byte[]占用99%的空间,然后点开查看实例发现是http占 ...