首页 > 解决方案 > 流 (OOP) 在程序集级别上是如何表示的?

问题描述

Java 的 Stream API 或 RxJava 之类的流如何在程序集级别上表示?

IE

List<String> myList =
    Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
    .stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

标签: javaassemblycompiler-constructionjava-streamrx-java

解决方案


这是一个非常复杂的话题,几句话就可以涵盖。您可以从Brian Goetz这篇文章开始研究,以了解 Java Stream API 的概念。之后,您将能够轻松深入。

首先仔细看看 Spliterator 抽象:

流源由称为 Spliterator 的抽象描述。顾名思义,Spliterator 结合了两种行为:访问源的元素(迭代),以及可能分解输入源以进行并行执行(拆分)。

然后看看 Stream flags :

在内部表示中,流水线的每个阶段都由流标志位图描述,该位图描述了流流水线这一阶段的元素的已知信息。Streams 使用这些标志来优化流的构造和执行。

和流管道的执行

当终端操作启动时,流实现选择一个执行计划。

对于顺序执行,Streams 构造了一个“机器”——其结构与管道结构相匹配的消费者对象链。这些消费者对象中的每一个都知道下一阶段;当它接收到一个元素(或被通知没有更多元素)时,它会将零个或多个元素发送到链中的下一个阶段。

然后,您将能够了解每个中间操作和终端操作如何在汇编级别表示。


推荐阅读