继续对流进行学习,首先先说明一下流的特点:

1、Collection提供了新的stream()方法。

2、流不存储,通过管道的方式获取值。

3、本质是函数式的,对流的操作会生成一个结果,不过并不会修改底层的数据源,集合可以作为流的底层数据源。
其中需要注意标红的说明,也就是说对于流操作它的源数据是不会被更改的,另外还有一点需要有一个认知:对于一个流可能有若干个中间操作,对于这些操作并非降低了整体的执行性能,反而会有提升,比如说增加了三个中间操作,可能感受会有三次循环,但是实际并非是咱们想象的这样,这个随着流的不断深入就会体会到这点的。

4、延迟查找,很多流操作(过滤filter、映射map、排序sort等)都可以延迟实现。

接着再用代码来进行操练,首先构建一个Stream对象,这里用一个集合的方式构建,然后将它转换数组,如下:

下面具体看一下该方法的定义:

而IntFunction的接口原型如下:

那这个参数如何写呢?当然可以用Lambda表达式啦,那具体如何表示呢?看下面:

其实对于这个toArray()参数还可以改用方法引用,那如何写呢?

接下来想办法将Stream转换为一个List,如何搞呢?

所以转换如下:

初略查看一下上面用到的Collectors类,发现其实它是Java1.8针对集合提供的一个工具类,里面包含若干个实现的工具方法,如下:

那看一下用到的toList()方法的实现:

而回到Stream.collect()方法,它还有另外一个比较复杂的方法重载,如下:

点进去查看一下该方法的定义:

是不是跟第一个collect()方法中使用的Collectors.toList()方法的具体实现中CollectorImpl中的参数一样?既然用stream.collect(Collectors.toList())能达到转换成List的目的,还研究第二种比较复杂重载的stream.collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner)干嘛呢?因为要想搞清楚stream.collect(Collectors.toList())就必须理解这种比较复杂的collect(),因为Collectors.toList()最终的实现就是跟比较复杂的collect()的实现类似,所以说接下来好好理解一下这个比较复杂的方法,确实是不太好理解,先读下它的javadoc:

那什么叫"mutable reduction可变的汇聚"呢?接着看解释:

不晓得说的是什么意思,下面有个例子对其进行说明:

那如何调用这种复杂的collect()方法来实现stream.collect(Collectors.toList())同样的效果呢?实现过程会要复杂很多,但是这个复杂的过程是对其内部了解起到很大的作用,所以有必要折腾一下:

首先第一个参数传递的它:

而Supplier接口的原型是:

因为这个参数是作为最终方法的结果,所以很显然最终应该返回一个ArrayList,所以传参可以这么搞:

接着再来传第二个参数,看下它的原型:

那什么叫累加器呢?在方法注释上也可以看出:

而BiConsumer的接口原型如下:

那这个参数可以这样来传:

还有最后一个参数,它也是BiFunction类型的,如下:

这里先直接上代码,之后再来理解它:

那对于第三个参数的合并器如何来理解呢?其实就是将上一次添的加结果集最终合并到要返回的结果集当中,其中theList1则为要返回的结果集,theList2为上一次累加的结果集,比较难以理解。

其实对于上面的实现还可以用方法引用的方式来代替,这里打算改用LinkedList再改用方法引用去弄,传第一个参数既要返回的结果:

接着传第二个累加器参数,需要接收两个参数,无返回值,这时可以看一下LinkedList.add()方法,如下:

所以第二个参数可以这样写:

接着第三个参数,由于跟第二个参数类型一样,类似的对于LinkedList中有一个addAll方法:

依然可以用方法引用嘛,如下:

好了,接下来再回过头来继续读一下collect()方法:

接下来看一下参数的说明:

再结合咱们的代码来说:

接着再回到stream.collection(Collectors.toList())这个简单的重载方法,看一下它系统的实现:

所以虽然复杂的这个重载方法理解起来比较麻烦,但是这个麻烦是值得滴,另外还有一个原因,因为stream.collection(Collectors.toList())只返回的是一个ArrayList,如果想要返回其它类型的集合如咱们已经实现的LinkedList,那就必须理解复杂的collect()。

java8学习之Stream深度解析与源码实践的更多相关文章

  1. Spring源码深度解析-《源码构建》

    1.gradle构建eclipse项目时,gradle-5.0版本构建失败,gradle-3.3构建成功!Why 2.导入spring-framework-3.2.x/spring-beans之前先导 ...

  2. Netty 学习(十):ChannelPipeline源码说明

    Netty 学习(十):ChannelPipeline源码说明 作者: Grey 原文地址: 博客园:Netty 学习(十):ChannelPipeline源码说明 CSDN:Netty 学习(十): ...

  3. 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试

    机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...

  4. 深度学习(七十一)darknet 源码阅读

    深度学习(七十一)darknet 源码阅读

  5. Java并发包源码学习系列:线程池ScheduledThreadPoolExecutor源码解析

    目录 ScheduledThreadPoolExecutor概述 类图结构 ScheduledExecutorService ScheduledFutureTask FutureTask schedu ...

  6. [阿里DIN] 深度兴趣网络源码分析 之 如何建模用户序列

    [阿里DIN] 深度兴趣网络源码分析 之 如何建模用户序列 目录 [阿里DIN] 深度兴趣网络源码分析 之 如何建模用户序列 0x00 摘要 0x01 DIN 需要什么数据 0x02 如何产生数据 2 ...

  7. [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构

    [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 目录 [阿里DIN] 深度兴趣网络源码分析 之 整体代码结构 0x00 摘要 0x01 文件简介 0x02 总体架构 0x03 总体代码 0x0 ...

  8. HtmlAgilityPack --解析Html源码

    最近项目需要从网络上抓取一下数据解析Html源码,奈何正则表达式难写,于是网上搜索找到了“ HtmlAgilityPack”类库,敏捷开发,果然效率非同寻常. 在此做笔记,写下心得,顺便给自己总结一下 ...

  9. 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...

随机推荐

  1. jdk1.8-stack 栈源码分析

    一:类的继承关系 UML图: 类的继承关系: )) { ) { ) );} 分析:栈的peek()方法,其实就是返回栈顶部的元素值,即数组末尾元素值. peek()方法只是返回下标的值,但并不删除该元 ...

  2. python-阿里镜像源-pip

    将pip源设置为国内 >>>windows 1 地址栏输入%appdata% 2 新建pip文件价 3 文件夹里建pip.ini 内容: [global] timeout = 600 ...

  3. Python学习之初识

    第一章 1.1 typora 的安装与使用 1.1.1 标题的创建: 方法一:用 ###+空格 表示标题,几个#就是几级标题 方法二:菜单栏-->段落-->选择标题 1.1.2 有序列表与 ...

  4. jenkins自动化部署springboot

    一.linux按jar包名称部署 1.执行shell PID=$(ps -ef | grep app.jar | grep -v grep | awk '{ print $2 }') if [ -z ...

  5. PTA(Basic Level)1047.编程团体赛

    编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: 输入第一行给出一个正 ...

  6. 300英雄的危机(heroes)

    题面 正解与图书馆馆长的考验一致,都是分层图SPFA: #include <iostream> #include <cstdio> #include <cstring&g ...

  7. 【2017.12.02】C组比赛总结

    这次考得不怎么样,只有200分! T1:读书 这题水水水! 这题就是一道循环题嘛! 直接一边循环一边做就好了! T2:恐怖分子 这题我是直接暴力的. 这题就是求至少用多少条经过(x0,y0)的不同直线 ...

  8. (转)当margin-top、padding-top的值为百分比时是如何计算的?

    本文链接:https://blog.csdn.net/qq_27437967/article/details/72625900问题:当margin-top.padding-top的值是百分比时,分别是 ...

  9. sql--left join,right join, inner join

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  10. php和java语法区别

    Java和PHP的基本语法基本相同,其实大部分的语言的基本语法也都相同,但是他们还是有一些细微的区别: 1.PHP是一种脚本语言,代码在服务器上执行,而结果以纯文本返回浏览器. 2.PHP能够运行在各 ...