在上一次【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. Tor路径选择说明

    Tor Path Specification Roger Dingledine Nick Mathewson Note: This is an attempt to specify Tor as cu ...

  2. linux下安装jdk8并且配置环境变量

    su回车进入root账户 查看是否安装过jdk8使用命令 # rpm -qa | grep -i jdk 创建文件夹用来存放下载的jdk使用命令 # mkdir -p /usr/local/src/j ...

  3. 基于OpenCV的三维数据点的曲面重构_MySurefaceReconstruction

    在Opencv中有个Viz模块,可以显示三维物体,还可以实现三维动画,本来是很好的东东,但是里面的函数.类的说明太过简单,始终不得要领.不过其中一个扩展功能非常好,就是你可以在vtk中设计自己的模型类 ...

  4. 网络编程介绍,C/S 架构,网络通讯协议,osi七层

    网络编程: 什么是网络编程: 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 编写基于网络的应用程序的过程序称之为网络编程 为什么要学习网络编程: 我们已经知道计算机, ...

  5. Pytorch1.0深度学习:损失函数、优化器、常见激活函数、批归一化详解

    不用相当的独立功夫,不论在哪个严重的问题上都不能找出真理:谁怕用功夫,谁就无法找到真理. —— 列宁 本文主要介绍损失函数.优化器.反向传播.链式求导法则.激活函数.批归一化. 1 经典损失函数 1. ...

  6. PhpMyAdmin提示未加密

    新版本的PhpMyAdmin 增强了安全性,需要在配置文件设置一个短语密码.否则进入之后会有“配置文件现在需要一个短语密码.”的红色警叹提示. 解决方法: .将 phpMyAdmin/librarie ...

  7. 【神经网络与深度学习】ZLIB介绍

    zlib类库提供了很多种压缩和解压缩的方式,由于时间的关系我只学习一下内容,以下是我在实现web 服务器压缩数据网页中使用到一些函数和常用数据结构.常量等. zlib使用过程 压缩过程:deflate ...

  8. Go语言入门篇-网络经验

    Go语言学习手册 golang*看云  golang圣经 wuYinIO 1.go语言开发中的坑 go新手容易犯的三个致命错误   Golang 需要避免踩的 50 个坑 2.go语言数据类型 map ...

  9. @Transient注解的使用(不被序列化和作为临时变量存储)

    转自:https://blog.csdn.net/sinat_29581293/article/details/51810805 java 的transient关键字的作用是需要实现Serilizab ...

  10. Linux 概念与快捷方式

    概念 何为shell Shell 是指"提供给使用者使用界面"的软件(命令解析器),类似于 DOS 下的 command(命令行)和后来的 cmd.exe .普通意义上的 Shel ...