当前位置: 首页 > 知识库问答 >
问题:

串行蒸汽的性能、内部工作和执行顺序

田鹤轩
2023-03-14

我不相信添加流仅仅是为了通过欺骗函数式编程来增加代码的可读性。

如果我在流上执行多个操作,它们是如何在内部计算的。

> < li>

在应用多个地图函数的情况下,如何计算地图html" target="_blank">函数。一次一个元素或一个完整流上的一个映射操作,然后是另一个。

在性能方面,它与在集合上执行的正常迭代有何不同。

当谈到非并行流时,元素的计算顺序是否仅取决于输入集合的类型(i、e为list排序、link edHashmap、sortedset和un的hashSet等)。

我能否对流的内部工作有更多的见解,以便更好地决定何时不建议使用流,何时建议使用流。(要检查的因素,如集合大小、序列性质等)

我知道字节码是以. class的形式为每个类创建的。字节码是如何为流操作中内部使用的所有lambda函数创建的呢?

    List<Integer> ee = new ArrayList<Integer>();
    Function<? super Integer, ? extends Integer> f1 = x -> x * 2;
    Function<? super Integer, ? extends Integer> f2 = x -> x * x;
    Function<? super Integer, ? extends Integer> f3 = x -> x / 2;

    ee.stream().map(f1).map(f2).map(f3).collect(Collectors.toList());

共有1个答案

劳灵均
2023-03-14

>

  • 当前Stream API实现逐个处理元素,而无需中间缓冲,除非必须这样做。对于顺序流,仅sorted()操作是“全屏障”操作,因此对于map(f1). sorted(). map(f2)f1将应用于整个流,然后将对结果进行排序,f2将应用于每个结果项。在其他情况下,包括相邻的map(f1). map(f2)f1f2函数将同时应用于第一个元素,然后都应用于第二个元素,依此类推。

    可能更快也可能更慢,这在很大程度上取决于许多事情,包括您使用的操作、哪个集合是您的流源、您有多少输入元素以及您如何收集结果。

    在当前实现中-是的。尽管没有指定。规范要求整个流中使用的大多数函数(例如传递给map的函数)是无状态的,所以如果你的程序行为取决于lambdas的执行顺序,你很可能违反了指定的契约。

    最重要的因素是代码清晰度。如果使用流 API 使代码更易于阅读,则可能可以使用它。如果您清楚地看到您的流是性能瓶颈,您可以尝试摆脱它。然而,这在实践中很少发生。我倾向于避免创建许多非常短的流,因为它们会产生垃圾,因此许多短流意味着每个处理元素的垃圾很多。然而,这在实践中并不总是重要的。

    Lambda 被编译为在类体内分离合成方法,并在运行时扩展到实现相应函数接口并调用该合成方法的匿名类。这是使用invokedynamic字节码指令和引导工厂完成的(参见标准库中的java.lang.invoke.LambdaMetafactory类)。如果您的 lambda 未捕获任何内容,则运行时表示形式将是单例。否则,每次都会创建该匿名类的新实例。

  •  类似资料:
    • 我在某处读到过,流操作总是在终端操作时返回一个新集合,并且不会更改已应用流操作的原始集合。 但在我的情况下,原始列表已被修改。 修改此操作后,订阅列表仅包含AlertPrefContactTypeEnum。PRIMARY和AlertPrefContactTypeEnum。次要对象。我的意思是列表的大小保持不变,但值发生了变化。

    • 本文向大家介绍setTimeout和Promise的执行顺序?相关面试题,主要包含被问及setTimeout和Promise的执行顺序?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先我们来看这样一道题: 输出答案为2 10 3 5 4 1 要先弄清楚settimeout(fun,0)何时执行,promise何时执行,then何时执行 settimeout这种异步操作的回调,只有主线程

    • 15.3 循环执行的例行性工作调度 相对于 at 是仅执行一次的工作,循环执行的例行性工作调度则是由 cron (crond) 这个系统服务来控制的。刚刚谈过 Linux 系统上面原本就有非常多的例行性工作,因此这个系统服务是默认启动的。另外, 由于使用者自己也可以进行例行性工作调度,所以啰, Linux 也提供使用者控制例行性工作调度的指令 (crontab)。 下面我们分别来聊一聊啰! 15.

    • 问题内容: 我有一个抽象基类,用作我的单元测试(TestNG 5.10)的基础。在该类中,我将初始化测试的整个环境,设置数据库映射等。此抽象类具有一个带有注释的方法,该方法可以进行初始化。 接下来,我用具有方法和方法的特定类扩展该类。这些方法对环境进行类特定的初始化(例如,将一些记录放入数据库中)。 如何执行带注释的方法的特定顺序?我需要先执行抽象基类中的那些,然后再执行扩展类中的那些。 例: 预

    • 我有一个Spring Boot应用程序,当我从Intellij作为maven配置运行它时,它可以正常运行。 我有一个用属性文件定义的环境的项目结构。 等等。 我们的框架的工作方式是选择带有VM参数的env。例如或 错误是: 我尝试使用以下文件:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-e

    • 问题内容: 在Java8中运行以下流示例: 产量: 当然-这并不奇怪。由于http://docs.oracle.com/javase/8/docs/api/index.html?overview- summary.html ,流是顺序执行还是并行执行都没有关系: 除了标识为明确不确定的操作(例如findAny())之外,流是顺序执行还是并行执行都不应该更改计算结果。 AFAIK 是确定性的并且是关

    • 因为在过滤2之后,我们还得再找到一个元素来分层极限(2),操作,那么为什么输出不像我解释的那样呢?

    • redis的时间事件的执行过程和工作内容