• Java---Stream进阶


    由于本文需要有一定的Stream基础,所以如果不懂什么是Stream的同学请移步:Java---Stream入门

    操作分类

    graph LR 操作分类 --- 中间操作 终端操作 --- 操作分类 中间操作 --- 有状态 中间操作 --- 无状态 短路 --- 终端操作 非短路 --- 终端操作

    中间操作只进行操作的记录,而实际的操作是由终端操作来执行的。如下面的例子。

    张三的妈妈想让张三帮忙买调料,所以将需要购买的调料写在一张纸上交给张三。(中间操作)

    纸:

    小葱、大蒜、生姜、鸡精、酱油。。。

    张三拿着纸条去买菜。(终端操作)

    中间操作

    中间操作分为两种:有状态,无状态。

    • 有状态:处理不止依赖当前元素。如,sorted(需要得到所有元素才可以排序不是吗)。
    • 无状态:处理只以来当前元素。如,map(只需要对当前元素进行类型转换不是吗)。

    AbstractPipeline

    非常重要的类,本质是个双链表,有着一下三个成员变量。Stream可以延迟执行的其中一个原因就是这个抽象类。可以说这个抽象类定义了中间操作的各种行为。

    • sourceStage: 指向头结点。每一次中间操作会增加一个节点,为了在O(1)的时间复杂度找到头结点而定义。有点并查集的感觉。
    • previousStage: 前驱节点。
    • nextStage: 后驱节点。
    • sourceOrOpFlags: 这里存的是一个int数值,来自枚举StreamOpFlag类。不用纠结这个类中各种数值的计算,这就是个标记,用来记录当前节点是做什么操作。如,filter等。

    每一次中间操作就会生产一个上述节点。

    终端操作

    终端操作分为两种:短路与非短路

    • 短路:找到了满足条件的数据后直接中断操作。
    • 非短路:对于每个元素都做完一遍操作。

    Sink

    可以看出分为三种:Chained与Of,以及TerminalSink

    • Chained:用来生成中间操作的Sink链表。
    • Of:用来执行具体的accept。
    • TerminalSink:生成终端操作的Sink节点。

    执行流程

    样例

    1. List<Integer> list = new ArrayList<>();
    2. list.add(3);
    3. list.add(1);
    4. list.add(4);
    5. list.add(2);
    6. list.add(2);
    7. list.stream().distinct().filter(t -> t < 4)
    8. .map(String::valueOf).sorted()
    9. .forEach(System.out::println);

    可以看出Stream的执行流程如下:

    逐步生成每一步中间操作的节点 -> 生成终端操作的Sink节点 -> 生成每一步中间操作的Sink节点 -> begin -> 执行各个中间操作以及终端操作 -> end

    简单阐述下Stream流程的三个部分:

    1. 获取head且逐步生成AbstractPipeline的双链表。
    2. 从上述双链表的最后一个节点向前驱节点迭代生成Sink链表。
    3. 迭代Sink链表逐个执行中间操作与终端操作。

    并行流的执行使用了ForkJoin架构,先根据元素的数量通过分治的方式分解为单一元素的Stream,对单个Stream处理,然后再合并。

    流程也符合上述案例,但各个部分的执行实际上存在并发并行,多了最后的合并操作。

    本文建议结合源码一起阅读理解,涉及到的源码特别多(建议适当阅读,碰到复杂难懂的算法可以跳过,不要死磕),所以本文中并未贴出。

  • 相关阅读:
    封装了一个简单的C++ HDF5工具库,实现常用数据类型的读写
    培美曲塞肌白蛋白纳米粒|磺胺地索辛豆清白蛋白纳米粒|茴香酰胺蓖麻蛋白纳米粒(化学品)
    栈回溯之手动分析栈空间
    TrendMicro:Apex One Server 工具文件夹
    flutter:监听路由的变化
    计算机竞赛 深度学习YOLOv5车辆颜色识别检测 - python opencv
    安装指定版本nodejs
    Docker笔记
    结合 LDAP 和 RADIUS 认证的无线网络安全方案
    随手笔记(二)
  • 原文地址:https://blog.csdn.net/Chenhui98/article/details/126813306