java8学习之Stream源码分析
2018-02-02 15:43
417 查看
上一次已经将Collectors类中的各种系统收集器的源代码进行了完整的学习,而在之前咱们已经花了大量的篇幅对其Stream进行了详细的示例学习,如:
那接下来则通过源代码的角度来对Stream的运作原理进行深入的学习,比如:Stream里面提供了这么多方法都是如何实现的?串行流与并行流又是如何调用的?对于并行流它又是如何利用ForkJoin这样的一个框架进行任务的切割和合并的?下面开始:
首先找开Stream类的源代码,先看一下它的定义:
而它是继承了BaseStream,如下:
所以,先来瞅一下BaseStream长啥样:
又继承了AutoCloseable,那不又进去瞅下它呗~
那它是干嘛的呢?从名字上来看是"自动关闭",可以看一下这个接口就提供了一个唯一的关闭方法,如下:
接着看一下这个接口的javadoc:
那最终是表达一个什么意思呢?其实这是JDK1.7给咱们提供的一个简化代码的一个特性,比如说:对于文件流的操作,我们通常的做法是try里面打开,如果异常了则在catch中进行处理,使用完之后再到finally块中将打开的流给关闭掉,但是!!!这种传统的方式会有一个这样的缺陷,就是说使用者在打开流的时候可能会忘了最终将它关闭掉而造成资源上的浪费,而流如果未关的话是不会报错的,这样资源就被一直占据住了,而当这种情况越来越多的话则就会造成资源的耗尽最终造成崩溃异常,所以这个接口的推出也就是为了帮我们解决这个问题的,说起来还是有些抽象,下面用代码来说明一下:
接着来应用一下:
接下来运行看下结果:
那这个close()方法何时才被调用的呢?实际上是将try的代码块执行完之后就会自动调用close()方法,所以以后对于这种使用了某种操作之后需要将其资源关闭的功能可以尝试采用这个新的特性,让我们的代码变得更加的简单而出错率更少。
那接下来则通过源代码的角度来对Stream的运作原理进行深入的学习,比如:Stream里面提供了这么多方法都是如何实现的?串行流与并行流又是如何调用的?对于并行流它又是如何利用ForkJoin这样的一个框架进行任务的切割和合并的?下面开始:
首先找开Stream类的源代码,先看一下它的定义:
而它是继承了BaseStream,如下:
所以,先来瞅一下BaseStream长啥样:
又继承了AutoCloseable,那不又进去瞅下它呗~
那它是干嘛的呢?从名字上来看是"自动关闭",可以看一下这个接口就提供了一个唯一的关闭方法,如下:
接着看一下这个接口的javadoc:
那最终是表达一个什么意思呢?其实这是JDK1.7给咱们提供的一个简化代码的一个特性,比如说:对于文件流的操作,我们通常的做法是try里面打开,如果异常了则在catch中进行处理,使用完之后再到finally块中将打开的流给关闭掉,但是!!!这种传统的方式会有一个这样的缺陷,就是说使用者在打开流的时候可能会忘了最终将它关闭掉而造成资源上的浪费,而流如果未关的话是不会报错的,这样资源就被一直占据住了,而当这种情况越来越多的话则就会造成资源的耗尽最终造成崩溃异常,所以这个接口的推出也就是为了帮我们解决这个问题的,说起来还是有些抽象,下面用代码来说明一下:
接着来应用一下:
接下来运行看下结果:
那这个close()方法何时才被调用的呢?实际上是将try的代码块执行完之后就会自动调用close()方法,所以以后对于这种使用了某种操作之后需要将其资源关闭的功能可以尝试采用这个新的特性,让我们的代码变得更加的简单而出错率更少。
相关文章推荐
- Java并发包源码学习之线程池(一)ThreadPoolExecutor源码分析
- Java学习之自动装箱和自动拆箱源码分析
- java学习之旅65--常用类_Date类的使用_JDk源码分析
- Java集合源码学习笔记(二)ArrayList分析
- java学习之旅56--数组_StringBuilder和StringBuffer的使用_常用方法_方法链的实现_JDK源码分析
- java util包学习(9)HashMap源码分析
- JDK源码学习之TreeMap.java分析
- ffmpeg学习七:avformat_find_stream_info函数源码分析
- Java学习之自动装箱和自动拆箱源码分析
- Java显式锁学习总结之四:ReentrantLock源码分析
- H264分析源码学习之结构体篇——h264_stream_t结构体
- 【面向对象课程项目:纸牌】Java实例学习(一):优秀源码的分析
- java学习笔记-String源码分析(2)
- Java集合源码学习笔记(三)LinkedList分析
- java util包学习(5) Vector 源码分析
- java学习之旅63常用类_包装类_Integer_Number_JDK源码分析
- Java显式锁学习总结之四:ReentrantLock源码分析
- [原创]java:Stream、Socket等源码分析
- Java集合源码学习笔记(四)HashMap分析
- Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析