Java---Stream进阶
由于本文需要有一定的Stream基础,所以如果不懂什么是Stream的同学请移步:Java---Stream入门
操作分类
操作分类 --- 中间操作
终端操作 --- 操作分类
中间操作 --- 有状态
中间操作 --- 无状态
短路 --- 终端操作
非短路 --- 终端操作
中间操作只进行操作的记录,而实际的操作是由终端操作来执行的。如下面的例子。
张三的妈妈想让张三帮忙买调料,所以将需要购买的调料写在一张纸上交给张三。(中间操作)
纸:
小葱、大蒜、生姜、鸡精、酱油。。。
张三拿着纸条去买菜。(终端操作)
中间操作
中间操作分为两种:有状态,无状态。
- 有状态:处理不止依赖当前元素。如,sorted(需要得到所有元素才可以排序不是吗)。
- 无状态:处理只以来当前元素。如,map(只需要对当前元素进行类型转换不是吗)。

AbstractPipeline
非常重要的类,本质是个双链表,有着一下三个成员变量。Stream可以延迟执行的其中一个原因就是这个抽象类。可以说这个抽象类定义了中间操作的各种行为。
- sourceStage:指向头结点。每一次中间操作会增加一个节点,为了在O(1)的时间复杂度找到头结点而定义。有点并查集的感觉。
- previousStage:前驱节点。
- nextStage:后驱节点。
- sourceOrOpFlags:这里存的是一个int数值,来自枚举StreamOpFlag类。不用纠结这个类中各种数值的计算,这就是个标记,用来记录当前节点是做什么操作。如,filter等。
每一次中间操作就会生产一个上述节点。
终端操作
终端操作分为两种:短路与非短路
- 短路:找到了满足条件的数据后直接中断操作。
- 非短路:对于每个元素都做完一遍操作。

Sink
可以看出分为三种:Chained与Of,以及TerminalSink
- Chained:用来生成中间操作的Sink链表。
- Of:用来执行具体的accept。
- TerminalSink:生成终端操作的Sink节点。
执行流程
样例
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(4);
list.add(2);
list.add(2);
list.stream().distinct().filter(t -> t < 4)
.map(String::valueOf).sorted()
.forEach(System.out::println);

可以看出Stream的执行流程如下:
逐步生成每一步中间操作的节点 -> 生成终端操作的Sink节点 -> 生成每一步中间操作的Sink节点 -> begin -> 执行各个中间操作以及终端操作 -> end
简单阐述下Stream流程的三个部分:
- 获取head且逐步生成AbstractPipeline的双链表。
- 从上述双链表的最后一个节点向前驱节点迭代生成Sink链表。
- 迭代Sink链表逐个执行中间操作与终端操作。
并行流的执行使用了ForkJoin架构,先根据元素的数量通过分治的方式分解为单一元素的Stream,对单个Stream处理,然后再合并。
流程也符合上述案例,但各个部分的执行实际上存在并发并行,多了最后的合并操作。
本文建议结合源码一起阅读理解,涉及到的源码特别多(建议适当阅读,碰到复杂难懂的算法可以跳过,不要死磕),所以本文中并未贴出。
Java---Stream进阶的更多相关文章
- java stream collector
Java Stream API进阶篇 本文github地址 上一节介绍了部分Stream常见接口方法,理解起来并不困难,但Stream的用法不止于此,本节我们将仍然以Stream为例,介绍流的规约操作 ...
- Java基础进阶
Java基础进阶J Object类 hashcode() toString() clone() getClass() notify() wait() equals() Random类 生成 随机数 U ...
- 全面吃透JAVA Stream流操作,让代码更加的优雅
全面吃透JAVA Stream流操作,让代码更加的优雅 在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行 ...
- 3.Java异常进阶
3.JAVA异常进阶 1.Run函数中抛出的异常 1.run函数不会抛出异常 2.run函数的异常会交给UncaughtExceptionhandler处理 3.默认的UncaughtExceptio ...
- Java Stream 使用详解
Stream是 Java 8新增加的类,用来补充集合类. Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的. Stream和其它集合类的区别在于:其它集合类主要关注与有限数量的 ...
- Java Stream API性能测试
已经对Stream API的用法鼓吹够多了,用起简洁直观,但性能到底怎么样呢?会不会有很高的性能损失?本节我们对Stream API的性能一探究竟. 为保证测试结果真实可信,我们将JVM运行在-ser ...
- Java字符串进阶
Java字符串进阶 前言 最常用的对字符串操作的类有三个,分别是String,StringBuilder,StringBuffer,下面将会详细的说说这三个类...... String String类 ...
- java stream 原理
java stream 原理 需求 从"Apple" "Bug" "ABC" "Dog"中选出以A开头的名字,然后从中选 ...
- 总结:Java 集合进阶精讲2-ArrayList
知识点:Java 集合框架图 总结:Java 集合进阶精讲1 总结:Java 集合进阶精讲2-ArrayList 初探: ArrayList底层结构是数组,是List接口的 可变数组的实现,所以会占用 ...
- 总结:Java 集合进阶精讲1
知识点:Java 集合框架图 总结:Java 集合进阶精讲1 总结:Java 集合进阶精讲2-ArrayList 集合进阶1---为集合指定初始容量 集合在Java编程中使用非常广泛,当容器的量变得非 ...
随机推荐
- 手写网站服务器~用Python手动实现一个简单的服务器,不借助任何框架在浏览器中输出任意内容
写在前面的一些P话: 在公司网站开发中,我们往往借助于Flask.Django等网站开发框架去提高网站开发效率.那么在面试后端开发工程师的时候,面试官可能就会问到网站开发的底层原理是什么? 我们不止仅 ...
- 强化学习-学习笔记4 | Actor-Critic
Actor-Critic 是价值学习和策略学习的结合.Actor 是策略网络,用来控制agent运动,可以看做是运动员.Critic 是价值网络,用来给动作打分,像是裁判. 4. Actor-Crit ...
- Tapdata Cloud 版本上新!率先支持数据校验、类型映射等6大新功能
Tapdata Cloud cloud.tapdata.net Tapdata Cloud 是国内首家异构数据库实时同步云平台,目前支持 Oracle.MySQL.PG.SQL Server.Mong ...
- 【ASP.NET Core】自定义的配置源
本文的主题是简单说说如何实现 IConfigurationSource.IConfigurationProvider 接口来自定义一个配置信息的来源,后面老周给的示例是实现用 CSV 文件进行应用配置 ...
- 记一道经典树上Nim游戏
这道题首先是 Hanriver 提出来的,但是大家都不会做,今天看到了一道一模一样的题目 AT2667 题目大意是,每个人删掉一个不是整棵树的原树的子树,给定一个树问游戏状态. 首先,这是需要用到多个 ...
- MVCC - Read View的可见性判断理解
读了 @SnailMann大佬[MySQL笔记]正确的理解MySQL的MVCC及实现原理 收益颇丰,非常感谢! 但对其中如何判断事务是否可见性还是不太理解,于是作了本文,在原博客基础上,举例画图论证. ...
- 查询postgresql表结构和索引
通过系统数据字典查询表结构 selectcol.table_schema,col.table_name,col.ordinal_position,col.column_name,col.data_ty ...
- 透过Redis源码探究Hash表的实现
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/667 本文使用的Redis 5.0源码 概述 我们在学习 Redis ...
- AtCoder Beginner Contest 247 F - Cards // dp + 并查集
原题链接:F - Cards (atcoder.jp) 题意: 给定N张牌,每张牌正反面各有一个数,所有牌的正面.反面分别构成大小为N的排列P,Q. 求有多少种摆放方式,使得N张牌朝上的数字构成一个1 ...
- 【Azure 应用服务】本地创建Azure Function Kafka Trigger 函数和Kafka output的HTTP Trigger函数实验
问题描述 在上一篇博文(https://www.cnblogs.com/lulight/p/16525902.html)中,我们成功的以VM作为Kafka服务器运行,并且验证了从其他机器中远程访问.在 ...