• java8学习之Stream源码分析


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

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

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

    而它是继承了BaseStream,如下:

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

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

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

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

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

    接着来应用一下:

    接下来运行看下结果:

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

  • 相关阅读:
    MySQL通过RPM安装
    HDU4279(2012年天津网络赛---数论分析题)
    Redis实战
    顺序环形队列的各种基本运算
    cocos2d_随手篇1_关于ccTouchBegan的调用
    URAL 1019
    Redis实战之Redis + Jedis
    dataGridView控件--未将对象引用设置添加到对象的实例
    创建 router 连通 subnet- 每天5分钟玩转 OpenStack(100)
    配置 L3 agent
  • 原文地址:https://www.cnblogs.com/webor2006/p/8405511.html
Copyright © 2020-2023  润新知