在上一次【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源码分析的更多相关文章

  1. java8学习之Collectors工厂类源码分析与实战

    如上一节[http://www.cnblogs.com/webor2006/p/8360232.html]在结尾处谈到的,彻底理解了Collector收集器之后,有必要对其系统Collectors实现 ...

  2. Redis学习之zskiplist跳跃表源码分析

    跳跃表的定义 跳跃表是一种有序数据结构,它通过在每个结点中维持多个指向其他结点的指针,从而达到快速访问其他结点的目的 跳跃表的结构 关于跳跃表的学习请参考:https://www.jianshu.co ...

  3. Nginx学习笔记(五) 源码分析&内存模块&内存对齐

    Nginx源码分析&内存模块 今天总结了下C语言的内存分配问题,那么就看看Nginx的内存分配相关模型的具体实现.还有内存对齐的内容~~不懂的可以看看~~ src/os/unix/Ngx_al ...

  4. Nginx学习笔记(四) 源码分析&socket/UDP/shmem

    源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_socket.h&Ngx_s ...

  5. Java显式锁学习总结之六:Condition源码分析

    概述 先来回顾一下java中的等待/通知机制 我们有时会遇到这样的场景:线程A执行到某个点的时候,因为某个条件condition不满足,需要线程A暂停:等到线程B修改了条件condition,使con ...

  6. Python学习---Django的request.post源码分析

    request.post源码分析: 可以看到传递json后会帮我们dumps处理一次最后一字节形式传递过去

  7. Java显式锁学习总结之五:ReentrantReadWriteLock源码分析

    概述 我们在介绍AbstractQueuedSynchronizer的时候介绍过,AQS支持独占式同步状态获取/释放.共享式同步状态获取/释放两种模式,对应的典型应用分别是ReentrantLock和 ...

  8. Redis学习之ziplist压缩列表源码分析

    一.压缩列表ziplist在redis中的应用 1.做列表键 当一个列表键只包含少量列表项,并且每个列表项要么是小整数,要么是短字符串,那么redis会使用压缩列表作为列表键的底层实现 2.哈希键 当 ...

  9. Redis学习之intset整数集合源码分析

    1.整数集合:整数的集合,升序排序,无重复元素 2.整数集合intset是集合键的底层实现之一,当一个集合只包含整数值的元素,并且这个集合的元素数量不多时,redis会使用整数集合作为集合键的底层实现 ...

随机推荐

  1. 40G传输技术浅析

    采用40G传输技术给运营商带来的好处 - 同样的带宽,更低的硬件成本.由于目前的光电器件工艺已臻于成熟,质量更为可靠,使40G的商用具有了必要的前提.同样是40G容量,器件的数量大致只有4个10G光接 ...

  2. 【HANA系列】SAP HANA LEFT/RIGHT字符串截取

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA LEFT/RI ...

  3. PI膜应变片试样制备

    一.选取基板 1.喷涂在玻璃基板上PI膜 2.正面用记号笔标记PI膜工艺参数——转速.厚度 3.玻璃板背面为PI膜 二.贴防护膜 1.事先画好二维图,以dxf格式存放 2.裁减合适的大小,并将其贴在打 ...

  4. C# 重写WndProc

    重写WndProc方法来处理 Windows 消息 处理 Windows 消息. 在开发winForm时,常常要处理Windows消息,可以重写WndProc来实现.常见代码如下: using Sys ...

  5. [爬虫] selenium介绍

    认识selenium 在爬取百度文库的过程中,我们需要使用到一个工具selenium(浏览器自动测试框架),selenium是一个用于web应用程序测试的工具,它可以测试直接运行在浏览器中,就像我们平 ...

  6. rtsp学习----海康RTSP客户端连接深入分析

    转载于:http://blog.csdn.net/zhouyongku/article/details/41546789 海康相机RTSP连接代码分析 最近在做海康相机rtsp连接获取音视频的工作,现 ...

  7. python学习笔记四 (运算符重载和命名空间、类)

    从以上代码中应该了解到: obj.attribute  查找的顺序: 从对象,类组成的树中,从下到上,从左到右到查找最近到attribute属性值,因为rec中存在name的属性,所以x.name可以 ...

  8. failed to push some refs to 'git@github.com:cq1415583094/MyBatis.git'解决办法

    将本地git仓库代码提交到GitHub上时,出现failed to push some refs to 'git@github.com:cq1415583094/MyBatis.git', 导致的原因 ...

  9. Spring基于SchedulingConfigurer实现定时任务

    Spring 基于 SchedulingConfigurer 实现定时任务,代码如下: import org.springframework.scheduling.annotation.Schedul ...

  10. P1004方格取数

    这是提高组得一道动态规划题,也是学习y氏思考法的第一道题. 题意为给定一个矩阵,里面存有一些数,你从左上角开始走到右下角,另一个人从右下角开始走到左上角,使得两个人取数之和最大,当然一个数只可以取走一 ...