2019独角兽企业重金招聘Python工程师标准>>>

Stream组成

在传统Java编程,或者说是类C语言编程中,我们如何操作一个数组数据呢?或者更泛化的讲,我们如何操作一个“集合”(Collection)数据呢?在Java中我们利用java.util包里的各种数据结构封装,来很好的表示了数组(Array)、集合(Set)、列表(List)和kv对象(Map)。但是抽象表示只是意味着存储和定义操作方法,具体如何访问中间的数据,其实还是比较原始的,或者换句话说,操作一个Collection的数据,我们使用的是Collection本身提供的API。就如我们访问一个List里的所有数据,需要一个for循环来get每个element。

Java 8引入了一个Stream对象,来重新封装集合中的数据,就像集合根据其特定的数据结构存储了数据,而Stream将其表示为一个数据流,一个类似List的有序的数据流。值得一提的是,Stream是不存储数据的,它核心是要将不同的数据——流化。

Stream包含一个*数据源头*(Source),一组(0个或多个)*中间操作*和一个*终止操作*。其实很好理解,一个流一定需要一个数据*源头*,毕竟要确定是哪些数据要流式处理。*中间操作*是一些类似map、filter之类的转换操作,也就是说map和filter只是将一个流变为新的流,它们可以串起来(stream pipeline)。而*终止操作*顾名思义,*终止操作*会结束流,*终止操作*包括产出结果型和边际效果型(side-effect),其中前者比如count之类的产出一个int值的,后者则是forEach之类的允许后续处理的。下面具体分开讲解一下Stream的各个组成部分。

源头(Source)

其中源头来源于数组、Collection、I/O资源和生成函数。

Arrays

通过一个数组生成一个流,是比较容易理解的。Java API也是通过Arrays.stream()方法来实现的:

public static <T> Stream<T> stream(T[] array, int startInclusive, int endExclusive) {return StreamSupport.stream(spliterator(array, startInclusive, endExclusive), false);}

看其声明就是将一个数组转换为一个Stream对象。其委托StreamSupport来构造,而StreamSupport的stream方法声明如下:

public static <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel) {Objects.requireNonNull(spliterator);return new ReferencePipeline.Head<>(spliterator,StreamOpFlag.fromCharacteristics(spliterator),parallel);}

这里一个很重要的参数是Spliterator,这是构造流的核心。ReferencePipeline.Head构造方法就是将一些属性设置好。而ReferencePipeline是个重要的概念,它是pipeline里对于*中间操作*和*源头*实现的抽象类,从其类声明中可以看出:

abstract class ReferencePipeline<P_IN, P_OUT>extends AbstractPipeline<P_IN, P_OUT, Stream<P_OUT>>implements Stream<P_OUT>  {}

两个泛型表示了pipeline的输入和输出。*中间操作*的实现很多也是由其实现的,比如map和filter。回到刚才的分析,因为ReferencePipeline构造后没有后续的方法链调用了。所以要理解的就是Spliterator这个东西是什么。

阅读全文直接点击:http://click.aliyun.com/m/9890/

转载于:https://my.oschina.net/u/3161071/blog/832558

【Java8精华教程】一起爪哇Java8——好用的Stream相关推荐

  1. RIA之家精华教程和资源集合

    RIA之家精华教程和资源集合 15天学会kissy 第一天:初识kissy 第二天:Hello World 第三天:event事件(基础篇) 第四天:DOM(基础篇) 第五天:DOM(进阶篇) 第六天 ...

  2. android开发教程21篇(强烈推荐,几乎每一篇都是精华教程)

    qianqianlianmeng android开发教程21篇(强烈推荐,几乎每一篇都是精华教程) 推荐hellogv 的二十一篇android开发教程,说句真心话,几乎是每一篇都是精华,值得很多开发 ...

  3. Google Android开发精华教程(apkbus整理)

    转载  Google Android开发精华教程 http://www.apkbus.com/android-13503-1-1.html

  4. java8 groupingby_Java8 教程第五章之Streams Collectors groupingBy

    本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵. 本节课先简单的介绍下Java8有哪些新特性,对于Java6/7版本做出哪些更改.那废话不多说,赶紧开始今天的课程吧. 在j ...

  5. java setshape 抗锯齿,Java8 中文教程

    Java 2D 文本渲染可能会受到"渲染提示"的影响. 回想一下,最重要的文本绘制方法如下: Graphics.drawString(String s, int x, int y) ...

  6. 【Java8新特性】关于Java8的Stream API,看这一篇就够了!!

    写在前面 Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*)  ,那什么是Stream API呢?Java8中 ...

  7. java8 nullpoint_仅当在Java8中使用lambda时不为null时才过滤值

    我有一个对象列表说汽车.我想基于使用Java 8的一些参数来过滤此列表.但是如果参数为null,则抛出NullPointerException.如何过滤掉空值? 目前的代码如下 requiredCar ...

  8. 收藏!2020上半年社区精华教程盘点

    还记得我们在今年4月时推出的 <Creator H5全平台游戏开发教程 PDF 免费下载(800+页)>吗? 当时晓衡就计划好了,每隔一段时间,会将公众号的上的干货精华进行整理,方便大家搜 ...

  9. java8 新特性 ibm_【Java8新特性】Streams(流)

    Java 8 引入了Stream(流式操作),你可以通过该操作实现对集合的并行处理和函数式操作.Collection是一种静态的内存数据结构,而Stream是面向计算的. Stream是Java 8中 ...

最新文章

  1. Sublime Text 3 及Package Control 安装(附上一个3103可用的Key)
  2. Unity增强现实初学者指南视频教程 A Beginner’s Guide to Augmented Reality with Unity
  3. 2018-4-8使用兔子的例子对比说明遗传算法,局部搜索,禁忌搜索,模拟退火方法
  4. 机器人行业专利构建与维护刻不容缓,专利研发需下苦功!
  5. 设置stm32系统各部分时钟
  6. python 中间一列左对齐_Python|fstring我喜欢Python的原因之一
  7. Exception: com.mchange.v2.c3p0.impl.NewProxyConnection cannot be cast to com.mysql.jdbc.Connection
  8. java 自定义注释_带有自定义注释的Java注释教程
  9. qt linux 添加库文件路径,Linux下Qt调用共享库文件.so
  10. Message Flood
  11. Sass:@error
  12. 各种常用浏览器 油猴脚本 插件 下载地址合集
  13. python制作回合制游戏脚本_Python制作回合制手游外挂简单教程(下)
  14. linux下思维导图软件,三款适合linux系统的超好用思维导图软件
  15. matlab 8点fft蝶形图,FFT快速傅里叶变换(蝶形算法)详解精要.ppt
  16. es中的keyword相关功能
  17. C语言实现推箱子游戏
  18. python计算等额本金_等额本金还款计算公式
  19. Linux的PS1美化
  20. Elasticsearch相关操作梳理

热门文章

  1. 不同编程语言在发生stackoverflow之前支持的调用栈最大嵌套层数
  2. 爬虫进阶教程:极验(GEETEST)验证码破解教程
  3. SQL Server Replication 中关于视图的点滴
  4. spring boot2 整合(一)Mybatis (特别完整!)
  5. Linux(CentOS 5)下安装Oracle10 客户端(转)
  6. Ansible自动化运维笔记1(安装配置)
  7. Android 应用 之路 MPAndroidChart~ScatterChart
  8. jQuery的使用及关于框架造型(转)
  9. Linux环境下USB的原理、驱动和配置
  10. poj2586(贪心盈亏问题)