【Java8精华教程】一起爪哇Java8——好用的Stream
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相关推荐
- RIA之家精华教程和资源集合
RIA之家精华教程和资源集合 15天学会kissy 第一天:初识kissy 第二天:Hello World 第三天:event事件(基础篇) 第四天:DOM(基础篇) 第五天:DOM(进阶篇) 第六天 ...
- android开发教程21篇(强烈推荐,几乎每一篇都是精华教程)
qianqianlianmeng android开发教程21篇(强烈推荐,几乎每一篇都是精华教程) 推荐hellogv 的二十一篇android开发教程,说句真心话,几乎是每一篇都是精华,值得很多开发 ...
- Google Android开发精华教程(apkbus整理)
转载 Google Android开发精华教程 http://www.apkbus.com/android-13503-1-1.html
- java8 groupingby_Java8 教程第五章之Streams Collectors groupingBy
本套JAVA8教程由于是有英文翻译过来的,如果有翻译不对的地方还请多多包涵. 本节课先简单的介绍下Java8有哪些新特性,对于Java6/7版本做出哪些更改.那废话不多说,赶紧开始今天的课程吧. 在j ...
- java setshape 抗锯齿,Java8 中文教程
Java 2D 文本渲染可能会受到"渲染提示"的影响. 回想一下,最重要的文本绘制方法如下: Graphics.drawString(String s, int x, int y) ...
- 【Java8新特性】关于Java8的Stream API,看这一篇就够了!!
写在前面 Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*) ,那什么是Stream API呢?Java8中 ...
- java8 nullpoint_仅当在Java8中使用lambda时不为null时才过滤值
我有一个对象列表说汽车.我想基于使用Java 8的一些参数来过滤此列表.但是如果参数为null,则抛出NullPointerException.如何过滤掉空值? 目前的代码如下 requiredCar ...
- 收藏!2020上半年社区精华教程盘点
还记得我们在今年4月时推出的 <Creator H5全平台游戏开发教程 PDF 免费下载(800+页)>吗? 当时晓衡就计划好了,每隔一段时间,会将公众号的上的干货精华进行整理,方便大家搜 ...
- java8 新特性 ibm_【Java8新特性】Streams(流)
Java 8 引入了Stream(流式操作),你可以通过该操作实现对集合的并行处理和函数式操作.Collection是一种静态的内存数据结构,而Stream是面向计算的. Stream是Java 8中 ...
最新文章
- Sublime Text 3 及Package Control 安装(附上一个3103可用的Key)
- Unity增强现实初学者指南视频教程 A Beginner’s Guide to Augmented Reality with Unity
- 2018-4-8使用兔子的例子对比说明遗传算法,局部搜索,禁忌搜索,模拟退火方法
- 机器人行业专利构建与维护刻不容缓,专利研发需下苦功!
- 设置stm32系统各部分时钟
- python 中间一列左对齐_Python|fstring我喜欢Python的原因之一
- Exception: com.mchange.v2.c3p0.impl.NewProxyConnection cannot be cast to com.mysql.jdbc.Connection
- java 自定义注释_带有自定义注释的Java注释教程
- qt linux 添加库文件路径,Linux下Qt调用共享库文件.so
- Message Flood
- Sass:@error
- 各种常用浏览器 油猴脚本 插件 下载地址合集
- python制作回合制游戏脚本_Python制作回合制手游外挂简单教程(下)
- linux下思维导图软件,三款适合linux系统的超好用思维导图软件
- matlab 8点fft蝶形图,FFT快速傅里叶变换(蝶形算法)详解精要.ppt
- es中的keyword相关功能
- C语言实现推箱子游戏
- python计算等额本金_等额本金还款计算公式
- Linux的PS1美化
- Elasticsearch相关操作梳理
热门文章
- 不同编程语言在发生stackoverflow之前支持的调用栈最大嵌套层数
- 爬虫进阶教程:极验(GEETEST)验证码破解教程
- SQL Server Replication 中关于视图的点滴
- spring boot2 整合(一)Mybatis (特别完整!)
- Linux(CentOS 5)下安装Oracle10 客户端(转)
- Ansible自动化运维笔记1(安装配置)
- Android 应用 之路 MPAndroidChart~ScatterChart
- jQuery的使用及关于框架造型(转)
- Linux环境下USB的原理、驱动和配置
- poj2586(贪心盈亏问题)