java8学习之Stream源码分析
上一次已经将Collectors类中的各种系统收集器的源代码进行了完整的学习,而在之前咱们已经花了大量的篇幅对其Stream进行了详细的示例学习,如:
那接下来则通过源代码的角度来对Stream的运作原理进行深入的学习,比如:Stream里面提供了这么多方法都是如何实现的?串行流与并行流又是如何调用的?对于并行流它又是如何利用ForkJoin这样的一个框架进行任务的切割和合并的?下面开始:
首先找开Stream类的源代码,先看一下它的定义:
而它是继承了BaseStream,如下:
所以,先来瞅一下BaseStream长啥样:
又继承了AutoCloseable,那不又进去瞅下它呗~
那它是干嘛的呢?从名字上来看是"自动关闭",可以看一下这个接口就提供了一个唯一的关闭方法,如下:
接着看一下这个接口的javadoc:
那最终是表达一个什么意思呢?其实这是JDK1.7给咱们提供的一个简化代码的一个特性,比如说:对于文件流的操作,我们通常的做法是try里面打开,如果异常了则在catch中进行处理,使用完之后再到finally块中将打开的流给关闭掉,但是!!!这种传统的方式会有一个这样的缺陷,就是说使用者在打开流的时候可能会忘了最终将它关闭掉而造成资源上的浪费,而流如果未关的话是不会报错的,这样资源就被一直占据住了,而当这种情况越来越多的话则就会造成资源的耗尽最终造成崩溃异常,所以这个接口的推出也就是为了帮我们解决这个问题的,说起来还是有些抽象,下面用代码来说明一下:
接着来应用一下:
接下来运行看下结果:
那这个close()方法何时才被调用的呢?实际上是将try的代码块执行完之后就会自动调用close()方法,所以以后对于这种使用了某种操作之后需要将其资源关闭的功能可以尝试采用这个新的特性,让我们的代码变得更加的简单而出错率更少。
java8学习之Stream源码分析的更多相关文章
- java8学习之Collector源码分析与收集器核心
之前已经对流在使用上已经进行了大量应用了,也就是说对于它的应用是比较熟悉了,但是比较欠缺的是对于它底层的实现还不太了解,所以接下来准备大量通过阅读官方的javadoc反过来加深对咱们已经掌握这些知识更 ...
- java8学习之groupingBy源码分析
继续接着上一次[http://www.cnblogs.com/webor2006/p/8366083.html]来分析Collectors中的各种收集器的实现, 对里它里面有个groupingby() ...
- Java8集合框架——LinkedList源码分析
java.util.LinkedList 本文的主要目录结构: 一.LinkedList的特点及与ArrayList的比较 二.LinkedList的内部实现 三.LinkedList添加元素 四.L ...
- Nginx学习笔记4 源码分析
Nginx学习笔记(四) 源码分析 源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_ ...
- MQTT再学习 -- MQTT 客户端源码分析
MQTT 源码分析,搜索了一下发现网络上讲的很少,多是逍遥子的那几篇. 参看:逍遥子_mosquitto源码分析系列 参看:MQTT libmosquitto源码分析 参看:Mosquitto学习笔记 ...
- Redis学习——ae事件处理源码分析
0. 前言 Redis在封装事件的处理采用了Reactor模式,添加了定时事件的处理.Redis处理事件是单进程单线程的,而经典Reator模式对事件是串行处理的.即如果有一个事件阻塞过久的话会导致整 ...
- Java多线程学习之ThreadLocal源码分析
0.概述 ThreadLocal,即线程本地变量,是一个以ThreadLocal对象为键.任意对象为值的存储结构.它可以将变量绑定到特定的线程上,使每个线程都拥有改变量的一个拷贝,各线程相同变量间互不 ...
- springMVC源码学习之addFlashAttribute源码分析
本文主要从falshMap初始化,存,取,消毁来进行源码分析,springmvc版本4.3.18.关于使用及验证请参考另一篇jsp取addFlashAttribute值深入理解即springMVC发r ...
- 大数据学习--day14(String--StringBuffer--StringBuilder 源码分析、性能比较)
String--StringBuffer--StringBuilder 源码分析.性能比较 站在优秀博客的肩上看问题:https://www.cnblogs.com/dolphin0520/p/377 ...
随机推荐
- Azure sql database 监控存储过程的传参情况
背景 实施开发的同事找到我,反馈说项目中使用Azure sql database 之后,无法使用Profiler来监控自己开发的存储过程的参数传参情况.确实profiler这些实例级别的工具在Azur ...
- iOS开发之点击tabBarItem进行Push一个页面
使用场景: 实现底部Tabbar两个TabBarItem,点击第二个跳转push到个人信息页面: 实现步骤: 首先设置UITabBarController的代理为appdelegate如下:myTab ...
- python与正则
想了解正则的使用,请点击:正则表达式.每种编程语言有一些独特的匹配方式,python也不例外: 语法 含义 表达实例 完整匹配匹配的字符串 \A 仅匹配字符串开头 \Aabc abc \Z 仅匹配字符 ...
- CentOS6.5升级手动安装GCC4.8.2 转载
一.简易安装 操作环境 CentOS6.5 64bit,原版本4.4.7,不能支持C++11的特性~,希望升级到4.8.2 不能通过yum的方法升级,需要自己手动下载安装包并编译 1.1 获取安装包并 ...
- 【HANA系列】【第四篇】SAP HANA XS使用服务器JavaScript Libraries详解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第四篇]SAP HANA XS ...
- ServletContainerInitializer
在web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能. 每个框 ...
- Windows Server 中配置权威时间服务器
0" style="box-sizing: inherit; outline: none;"> 若要配置 Windows 时间服务以使用内部硬件时钟,请使用下列方法 ...
- WCF客户端代理
创建类库WCFServiceProxy 添加System.ServiceModel.WCFService(见上篇文章)引用 创建类:BookServiceClient using System; us ...
- CentOS7修改内核启动顺序
CentOS7修改内核启动顺序: 1.首先查看当前系统有几个内核 cat /boot/grub2/grub.cfg |grep menuentry 2.查看当前默认内核 grub2-editenv ...
- aws 预留实例到期监控
环境准备 安装python的aws 开发工具包 pip install boto3 配置aws账号 [root@zabbix service]# aws configure AWS Access Ke ...