ReferencePipeline
用于描述中间管道阶段或者管道源阶段的抽象基类。
继承 AbstractPipeline,实现 Stream
AbstractPipeline
继承 PipelineHelper,实现 BaseStream
文档说明
- 管道类的抽象父类,是 Stream 接口及其原生特化的核心实现。它会管理流管道的构建及评估
- AbstractPipeline 代表一个流管道的的初始部分,它封装了流的源,以及一个或多个中间操作
- 每个 AbstractPipeline 对象通常被称为 stage(阶段),每个阶段描述的,要么是流的源,要么是一个中间操作
- 每个 AbstractPipeline 对象通常被称为 stage(阶段),每个阶段描述的,要么是流的源,要么是一个中间操作
- 一个具体的中间阶段通常通过一个 AbstractPipeline 构建,一个 “类型特化(shape-specific)管道” 继承它(如:IntPipeline)后仍旧抽象,再由一个“操作特化(operation-specific)”的具体类去继承前者
- AbstractPipeline 包含了大多数评价管道的机制,并且实现方法,这些实现的方法都会被操作使用到;“类型特化”的类会添加一些辅助方法,用于将结果集装到合适的“类型特化”的容器当中(也就是避免装箱拆箱的操作)
- 在链接一个新的中间操作,或者执行一个终止操作后,这个流就会被标记为已消费,并且不会再有更多的中间或终止操作添加到这个流实例当中
- implNote
- 对于串行流,以及所有中间操作都无状态的的并行流两种情况,管道的计算是在单个的过程中完成的,所谓的单个的过程就是,将所有的操作都放到一起完成
- 对于有状态操作的并行流,执行会被分为多个“段”,当中每个有状态的操作都会在段的结尾打上标识,然后每个段都会单独地进行计算,并且每段的输出结果都会作为下一段的输入
- 在所有的情况中,在一个终止操作开始之前,源数据都不会被消费
属性
- previousStage
- 上游的 pipeline,源阶段置 null
- 上游的 pipeline,源阶段置 null
- sourceStage
- 指向管道头的反指向链,源阶段为自身
- 指向管道头的反指向链,源阶段为自身
- sourceOrOpFlags
- combinedFlags
- depth
- 当前管道对象与流的源(串行)或前状态(并行)之间,中间操作的个数
- 在管道准备进行计算的时间点有效
- 当前管道对象与流的源(串行)或前状态(并行)之间,中间操作的个数
- parallel
- 是否并行,只在流的源阶段有效
- 是否并行,只在流的源阶段有效
- sourceSpliterator
- 源的 spliteraror,只在管道头有效
- 在管道被消费前,若为“非空”,则 sourceSupplier 必须为 null
- 在管道被消费后,若为“非空”,则将其置 null
- 源的 spliteraror,只在管道头有效
- sourceSupplier
- 源的 supplier,只在管道头有效
- 在管道被消费前,若为“非空”,则 sourceSpliterator 必须为 null
- 在管道被消费后,若为“非空”,则将其置 null
- 源的 supplier,只在管道头有效
构造方法
构造方法一:构造流管道的头
上游 pipeline 置 null,将带有数据源引用的 spliterator 赋给当前 pipeline,
将当前阶段标记为源阶段,配置操作属性,当前深度初始化为0,设置 串行/并行 标记
AbstractPipeline(Supplier<? extends Spliterator<?>> source, int sourceFlags, boolean parallel) { this.previousStage = null; this.sourceSupplier = source; this.sourceStage = this; this.sourceOrOpFlags = sourceFlags & StreamOpFlag.STREAM_MASK; // The following is an optimization of: // StreamOpFlag.combineOpFlags(sourceOrOpFlags, StreamOpFlag.INITIAL_OPS_VALUE); this.combinedFlags = (~(sourceOrOpFlags << 1)) & StreamOpFlag.INITIAL_OPS_VALUE; this.depth = 0; this.parallel = parallel; }
构造方法二:构造用于追加一个中间操作到一个既有的 pipeline 上
断言,若传入的上游 pipeline 已被链接过消费,则抛出异常;
将上游 pipeline 标记为已消费;将上游 pipeline 的下游指向当前 pipeline;将当前 pipeline 的上游指向上游 pipeline;
配置操作属性;深度 +1
AbstractPipeline(Spliterator<?> source, int sourceFlags, boolean parallel) { this.previousStage = null; this.sourceSpliterator = source; this.sourceStage = this; this.sourceOrOpFlags = sourceFlags & StreamOpFlag.STREAM_MASK; // The following is an optimization of: // StreamOpFlag.combineOpFlags(sourceOrOpFlags, StreamOpFlag.INITIAL_OPS_VALUE); this.combinedFlags = (~(sourceOrOpFlags << 1)) & StreamOpFlag.INITIAL_OPS_VALUE; this.depth = 0; this.parallel = parallel; }
ReferencePipeline.Head
表示 ReferencePipeline 的源阶段
继承了 ReferencePipeline(二者在大部分属性的设定上是类似的,但存在一些属性是不同的,比如说 Head 的 previousStage 是空的,而 ReferencePipeline 则存在 previousStage,等等)
构造方法
本质上是调用的是 AbstractPipeline 的构造方法一,
ReferencePipeline(Supplier<? extends Spliterator<?>> source, int sourceFlags, boolean parallel) { super(source, sourceFlags, parallel); }
ReferencePipeline(Spliterator<?> source, int sourceFlags, boolean parallel) { super(source, sourceFlags, parallel); }
ReferencePipeline.StatelessOp
一个基类,针对一个流的无状态的中间阶段,同样集成了 ReferencePipeline
构造方法
本质上调用的是 AbstractPipeline 的构造方法二
StatelessOp(AbstractPipeline<?, E_IN, ?> upstream, int opFlags) { super(upstream, opFlags); assert upstream.getOutputShape() == inputShape; }
原文地址:https://www.cnblogs.com/flying-snake/p/11531028.html
- 备战CDA数据分析竞赛!Kaggle赛题大揭秘
- 如何用Python将时间序列转换为监督学习问题
- Spring MVC的配置和使用
- Java可以如何实现文件变动的监听
- 借助GitHub搭建属于自己的maven仓库
- 如何使用 scikit-learn 为机器学习准备文本数据
- Hyperledger Fabric Chaincode 开发
- 使用VS Code开发asp.net core
- 以太坊·将自定义数据写入到区块链中
- 使用TensorFlow实现股票价格预测深度学习模型
- 06-移动端开发教程-fullpage框架
- 07-移动端开发教程-移动端视口
- 10-移动端开发教程-移动端事件
- 08-移动端开发教程-移动端适配方案
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python中get和post有什么区别
- workerman结合laravel开发在线聊天应用的示例代码
- php+js实现裁剪任意形状图片
- keras实现theano和tensorflow训练的模型相互转换
- python中round函数如何使用
- PHP array_reduce()函数的应用解析
- php微信公众号开发之简答题
- php5.x禁用eval的操作方法
- php微信公众号开发之图片回复
- php微信公众号开发之答题连闯三关
- swoole_process实现进程池的方法示例
- golang实现php里的serialize()和unserialize()序列和反序列方法详解
- keras 实现轻量级网络ShuffleNet教程
- Python应用实现处理excel数据过程解析
- Python实现爬取并分析电商评论