java8学习之Stream源码分析

摘要:
上次,我们对collectors类中各种系统收集器的源代码进行了完整的研究。在此之前,我们花了大量时间对其Stream进行了详细的示例研究。例如,接下来,我们从源代码的角度学习了Stream的操作原理。例如,流中提供的这么多方法是如何实现的?

上一次已经将Collectors类中的各种系统收集器的源代码进行了完整的学习,而在之前咱们已经花了大量的篇幅对其Stream进行了详细的示例学习,如:

java8学习之Stream源码分析第1张

那接下来则通过源代码的角度来对Stream的运作原理进行深入的学习,比如:Stream里面提供了这么多方法都是如何实现的?串行流与并行流又是如何调用的?对于并行流它又是如何利用ForkJoin这样的一个框架进行任务的切割和合并的?下面开始:

首先找开Stream类的源代码,先看一下它的定义:

java8学习之Stream源码分析第2张

而它是继承了BaseStream,如下:

java8学习之Stream源码分析第3张

所以,先来瞅一下BaseStream长啥样:

java8学习之Stream源码分析第4张

又继承了AutoCloseable,那不又进去瞅下它呗~

java8学习之Stream源码分析第5张

那它是干嘛的呢?从名字上来看是"自动关闭",可以看一下这个接口就提供了一个唯一的关闭方法,如下:

java8学习之Stream源码分析第6张

接着看一下这个接口的javadoc:

java8学习之Stream源码分析第7张

java8学习之Stream源码分析第8张

java8学习之Stream源码分析第9张

那最终是表达一个什么意思呢?其实这是JDK1.7给咱们提供的一个简化代码的一个特性,比如说:对于文件流的操作,我们通常的做法是try里面打开,如果异常了则在catch中进行处理,使用完之后再到finally块中将打开的流给关闭掉,但是!!!这种传统的方式会有一个这样的缺陷,就是说使用者在打开流的时候可能会忘了最终将它关闭掉而造成资源上的浪费,而流如果未关的话是不会报错的,这样资源就被一直占据住了,而当这种情况越来越多的话则就会造成资源的耗尽最终造成崩溃异常,所以这个接口的推出也就是为了帮我们解决这个问题的,说起来还是有些抽象,下面用代码来说明一下:

java8学习之Stream源码分析第10张

java8学习之Stream源码分析第11张

接着来应用一下:

java8学习之Stream源码分析第12张

接下来运行看下结果:

java8学习之Stream源码分析第13张

那这个close()方法何时才被调用的呢?实际上是将try的代码块执行完之后就会自动调用close()方法,所以以后对于这种使用了某种操作之后需要将其资源关闭的功能可以尝试采用这个新的特性,让我们的代码变得更加的简单而出错率更少。

免责声明:文章转载自《java8学习之Stream源码分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Deepfakes教程及各个换脸软件下载ffmpeg拼接视频方法concat下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MVVM大比拼之avalon.js源码精析

简介 avalon是国内 司徒正美 写的MVVM框架,相比同类框架它的特点是: 使用 observe 模式,性能高。 将原始对象用object.defineProperty重写,不需要用户像用knockout时那样显示定义各种属性。 对低版本的IE使用了VBScript来兼容,一直兼容到IE6。 需要看基础介绍的话建议直接看司徒的博客。在网上搜...

ubuntu下下载并安装H265(hm.x.x代码和X265代码)

H265,现今是High Efficiency Video Coding的别称,详细的概述见维基百科,详细的开发见官方网站。 一、下载并编译官方的测试源码HM.x.x: 1 ubuntu下安装svn: apt-get install subversion 2打开官方的存放目录,(当然该界面也可以通过上面的官方主页进入)找到需要的分支或下载版本,并复制该网址...

【spring源码系列】之【环境搭建】

1. gradle安装 1.1 下载gradle gradle官网下载对应的版本,笔者用的6.0.1,下载地址如下https://gradle.org/releases/,找到6.0.1,选择complete连接下载,如下图 1.2 配置环境变量 解压gradle到指定目录,配置环境变量GRADLE_HOME、Path,与JDK类似,如下图 在命令行输入g...

HashMap源码和并发异常问题分析

要点源码分析 HashMap允许键值对为null;HashTable则不允许,会报空指针异常; HashMap<String, String> map= new HashMap<>(2); map.put(null,null); map.put("1",null); Hash...

获取任何小程序源码

只需两步获取任何小程序源码  这种方法,并不能反编译出所有的小程序源码,请自知! 具体的局限请看:qwerty472123大神的md文件https://github.com/qwerty472123/wxappUnpacker 下面是原文:   最近在学习微信小程序开发,半个月学习下来,很想实战一下踩踩坑,于是就仿写了一个滴滴他们家的青桔单车小程序的...

漫画阅读器ComicReader应用源码

源码ComicReader,一个漫画app项目,集成了很多第三方库实现,数据是用jsoup从鼠绘漫画网站抓取的,值得学习的地方是作者的源码整合能力。用心做的app,非常不错,完全可以做成一个正式的app发布了。这里用到了很多第三方库,当然有些被我改的乱七八糟了,真对不起原作者,啊哈哈希望别打我就可以了。   源码下载: http://code.662p.c...