继续沿着上一次【http://www.cnblogs.com/webor2006/p/8311074.html】Collector接口的javadoc进行阅读,在继续阅读之前,其中有个比较难理解的地方需要再解释一下,如下:

上面的javadoc描述的到底是怎么一回事呢?下面来好好理解下:

对于combiner()方法是针对并行流(parallelStream())而言的,既然是并行流,当然是存在多个线程去执行,假设有4个线程,那肯定就会有4个"部份"结果,而这个方法的作用就是将这4个"部份"结果合并成一个,但是!!该方法最终是返回一个BinaryOperator,而它是接收两个同类型的参数并返回一个同类型的结果,所以可能存在以下情况:

对于"线程1结果、线程2结果、线程3结果、线程4结果",合并过程可能是如下:

线程1结果 + 线程2结果 最终合并成 5结果

5结果 + 线程3结果 最终合并成 6结果

6结果 + 线程4结果 最终合并成 7结果

其中“7结果”就是最终我们需要的合并之后的结果,那什么对于"线程1结果 + 线程2结果 最终合并成 5结果",其中javadoc中的"fold state from one argument into the other"也就是指将两个集合合并之后最终添加到另一个集合中,而对于咱们的这种情况很显然是将合并结果放到了一个新生成的结果容器当中了,此时这种情况就对应于javadoc说的这处地方:

接下来对于两个部份结果可能还存在这种合并情况:

对于线程1结果、线程2结果,将线程2的结果全部合并添加到线程1结果当中,最后再将线程1的结果返回回来,也就是并非有创建一个新的结果容器了,此时就对应于javadoc说的这种情况:

接下来继续来读Collector接口的javadoc,如下:

其中Characteristics是一个枚举,如下:

关于combiner()函数在开头就已经说明了,其实这句话就是描述咱们解释的这个意思,另外很明显combiner()只是针对并行操作而言的,对于串行操作是用不到combiner()的。

关于这两个条件下面对其进行了介绍,如下:

还是有些抽象,看下面的进一步解释:

那什么"a = combiner.apply(a, supplier.get())"这个等式会成立呢?需要举一个例子来说明一下:

对于combiner()操作是将两个参数合并成一个参数,其Lambda表达式可以用它来表示:

(List<String> list1, List<String> list2) -> { list1.addAll(list2); return list1; }

这属于combiner()中将一个元素折叠到另一个元素并将其返回的情况,以它做为模板,那回到咱们这个等式:

combiner.apply(a, supplier.get())这句说明list1=a、supplier.get()=list2,而由于supplier.get()返回的是一个空的结果容器,就像javadoc中描述的那样:

那执行combiner()函数之后,就会执行combiner.apply(a, supplier.get()) = list1.addAll(list2)=list1.addAll(空的结果容器) = list1 = a, 刚好等式成立。

接下来看另外一个特性:

从这里面可以看出,虽说使用上面来看是简单了,其实这个简单是因为底层将其复杂性给封装起来了。

这块暂且有个了解既可,之后还会详细研究的。

接下来这个规则就有一大堆英文,所以这个放到下次再学。

从读javadoc中将要点总结如下【跟上次读的一起汇总】:

1、stream.collect()名为收集器。

2、Collector作为collect方法的参数。

3、Collector是一个接口,它是一个可变的汇聚操作,将输入元素累积到一个可变的结果容器中;它会在所有元素都处理完毕之后,将累积的结果转换为一个最终的表示。【这是一个可选的操作】;它支持串行与并行两种方式执行。

4、Collectors本身提供了关于Collector的常见汇聚实现,Collectors本身实际上是一个工厂。【在之后也会研读它里面的源码滴】

5、为了确保串行与并行操作结果的等价性,Collector函数需要满足两个条件:identity(同一性) 与 associativty(结合性)。

6、a = combiner.apply(a, supplier.get())。

java8学习之Collector同一性与结合性分析的更多相关文章

  1. java8学习之Collector源码分析与收集器核心

    之前已经对流在使用上已经进行了大量应用了,也就是说对于它的应用是比较熟悉了,但是比较欠缺的是对于它底层的实现还不太了解,所以接下来准备大量通过阅读官方的javadoc反过来加深对咱们已经掌握这些知识更 ...

  2. java8学习之Collector复合与注意事项

    接着上一次[http://www.cnblogs.com/webor2006/p/8318066.html]继续对Collector进行javadoc详读,上一次读到了这: 接下来一条条来过目一下: ...

  3. JAVA8学习——新的时间日期API&Java8总结

    JAVA8-时间日期API java8之前用过的时间日期类. Date Calendar SimpleDateFormat 有很多致命的问题. 1.没有时区概念 2.计算麻烦,实现困难 3.类是可变的 ...

  4. memcached学习笔记——存储命令源码分析下篇

    上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...

  5. memcached学习笔记——存储命令源码分析上篇

    原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...

  6. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  7. Java8学习(3)- Lambda 表达式

    猪脚:以下内容参考<Java 8 in Action> 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 上一篇Java8学习(2) ...

  8. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  9. input子系统学习笔记六 按键驱动实例分析下【转】

    转自:http://blog.chinaunix.net/uid-20776117-id-3212095.html 本文接着input子系统学习笔记五 按键驱动实例分析上接续分析这个按键驱动实例! i ...

随机推荐

  1. [笔记] 使用v2r访问外网

    介绍 首先,你需要有一台能上外网的服务器,如AWS,GCP等. 其次,请自行复制全文,然后将FXXK替换为v2r的全称(5个小写字符). 服务器上Docker镜像配置流程 拉取镜像 $ sudo do ...

  2. Debian系统设置terminal快捷键

    我安装的是debian gnome桌面版.安装完成之后,没有快捷键可以方便的打开terminal,需要自己设置这个快捷键 方法是: 桌面上点击右键==>设置==>键盘 ==>快捷键= ...

  3. python爬虫前提技术

    1.BeautifulSoup 解析html如何使用 转自:http://blog.csdn.net/u013372487/article/details/51734047 #!/usr/bin/py ...

  4. redis外网无法连接问题

    1.外网无法连接redis 解决方法: 把redis.conf里的bind 127.0.0.1注释掉,不行的话把127.0.0.1修改成0.0.0.0 2.make的时候显示没有gcc 解决方法: 安 ...

  5. 分享一款架子鼓游戏【drum】

    视频演示: 电脑版和安卓版都有,没有ios版. 适合想练架子鼓,但是还没买架子鼓的朋友.可以先当做游戏来练练节奏感...下载如下: 电脑版下载>> 手机安卓版下载>>

  6. 惊讶!我定的日志规范被CTO在全公司推广了

    打印日志是一门艺术,但长期被开发同学所忽视.日志就像车辆保险,没人愿意为保险付钱,但是一旦出了问题都又想有保险可用.我们打印日志的时候都很随意,可是用的时候会吐槽各种 SB 包括自己!写好每一条日志吧 ...

  7. PJzhang:URL重定向漏洞的72般变化

    猫宁!!! 反射型xss的利用可以给对方发送钓鱼链接,窃取对方cookie,进入对方账户.   利用url重定向漏洞,发送给对方一个钓鱼链接,重定向到一个恶意网页,比如一个假的银行网站,被盗取账号密码 ...

  8. linux下安转nodejs

    转载自:https://www.cnblogs.com/zhuawang/p/7617176.html 在Linux系统安装Nodejs 最简单步骤 1.去官网下载和自己系统匹配的文件: 英文网址:h ...

  9. 必备idea 插件plugins 提高编码效率

    最近发现了几个非常好用   提高编码效率 的idea 插件 跟大家分享一下 因为idea自带的插件下载可能连接不上服务器而导致插件下载失败,所以这里推荐使用引入外部插件的方式 插件包也给你们准备好了( ...

  10. 概率DP(放棋子)Domination

    题意:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827369874 给你n*m的棋盘,我们定义放满棋盘是:任意一行一列至少有一 ...