java流中遇到顺序保存

2023-12-06

我已经经历过相关问题,例如如何确保java8流中的处理顺序?,我仍然不完全清楚输出元素的顺序。因此请澄清我以下的疑问。

 Integer[] intArray = {1, 2, 3, 4, 5, 6, 7, 8 };
            List<Integer> listOfIntegers =
                new ArrayList<>(Arrays.asList(intArray));
       listOfIntegers
            .parallelStream()
             .unordered()
            .forEachOrdered(e -> System.out.print(e + " "));

我认为至少理论上(或根据java规范)它可以按1、2、3、4、5、6、7、8的随机顺序打印。我对吗?

还有一个相关的问题——遇到订单保存的决定是在什么执行点做出的? 更准确地说,整个流管道 ORDER 特性的评估是否是在执行开始之前就通过源、中间操作和终端操作的特性来完成的?


来源的无序性质或通过以下方式显式发布订单合同unordered()可能会影响所有后续的管道阶段,除非它们引入了只能在以下情况下发生的顺序:sorted手术。

对于无状态中间操作,例如filter and map,无论如何没有区别,但是像这样的操作skip, limit and distinct根据先前的流状态是有序的还是无序的,可能会表现出不同的行为。这个答案举例说明如何distinct可能会受到之前的影响unordered().

请注意,原则上,sorted在引入顺序时,可能取决于前一阶段的有序状态,因为如果前一流是无序的,则可能会使用不稳定的排序算法。

这个答案提供了一种方法来打印流的特征并评估它们如何由于附加另一个操作而发生变化。

当您链接终端操作时,终端操作本身的无序性质或终端操作之前最后阶段的无序状态可能足以为终端操作选择一种不尝试保留顺序的算法。

原则上,终端操作的无序性质可用于影响前面的阶段,但由于无状态中间操作无论如何都不会受到影响,并且skip, limit, distinct必须遵守先前的有序状态,如果存在,唯一可能受到影响的操作是sorted如果后续操作无论如何都不关心顺序,那么它就会过时。

在当前的实现中,自 Java 8 update 60 以来,终端操作的无序性质不会影响之前阶段的行为。与之前的实现一样,进行了此更改,它错误地影响了skip and limit。失去消除过时排序步骤的机会并不被认为是一个问题,因为链接sort对于无序的后续操作,是一种特殊情况。看这个答案,包括评论,如果您想了解更多相关讨论。

So for

list.stream() // List.stream() returns an ordered stream
    .unordered() // releases order contract
    .distinct() // for equal elements, it may pick an arbitrary one
    .sorted() // re-introduces an order
    .skip(1) // will skip the minimum element due to the order
    .forEach(System.out::println); // may print the remaining elements in arbitrary order

流管道没有单一的有序或无序行为。

与...对比

hashSet.stream() // HashSet.stream() has no order (unless being a LinkedHashSet)
    .filter(Objects::nonNull) // not affected by order
    .distinct() // may use unorderedness, but has no effect anyway, as already distinct
    .skip(1) // may skip an arbitrary element
    .forEachOrdered(System.out::println); // would respect order if there was one

整个管道无序运行,只是因为源是无序的。有了有序源,它就会完全有序。

所以答案是“整个流管道ORDER特性的评估是否是在执行开始之前就通过源、中间操作和终端操作的特性来完成的?是的,这是在开始实际处理之前完成的,当有选择时,通过为管道阶段选择适当的算法,但此过程不一定会产生整个管道的单一特征。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java流中遇到顺序保存 的相关文章

随机推荐

  • 使用spring进行Java注解扫描

    我有几个类需要用名称进行注释 因此我将注释定义为 Retention RetentionPolicy RUNTIME Target ElementType TYPE public interface JsonUnmarshallable p
  • Ruby ** 双星运算符

    Ruby 中的 运算符是什么 代码片段 1 5 gt 1 43 67 gt 2769405330765659902380925787724104201956901039505346829415349981622358603023818638
  • IE 对 HTML5 文档类型属性选择器的支持

    w3school 关于属性选择器的章节指出 仅当指定 DOCTYPE 时 IE7 和 IE8 才支持属性选择器 IE7 和 IE8 无法识别 HTML5 文档类型 对吗 那么 这是否意味着如果我使用 HTML5 文档类型 IE7 和 IE8
  • Selenium 与 Python-unittest - 测试返回进程已完成,退出代码为 0,并且不执行任何操作

    有人可以帮助我理解为什么执行以下代码 但没有执行任何操作吗 返回代码为 0 但浏览器未打开或未执行任何操作 值得一提的是 setUp 方法已在其他模块中以相同的方式配置 并且工作正常 请查看最后的回复 import unittest fro
  • 如何翻译 Blazor 组件和 App.razor 中的字符串?

    我想本地化共享组件的字符串 例如 NavMenu razor 或 App razor 页面 我成功地按照中所述翻译了我的页面中的内容 NET Core 通用指令还有更多特定 Blazor 文档 创建具有正确名称的资源文件 例如 PageNa
  • 如何在 thymeleaf 中包含 message.properties

    I am using spring boot with thymeleaf This is my project structure 这是我的应用程序开始课程 EnableAutoConfiguration Configuration Co
  • 查询 documentdb 中的子字段

    例如 我有以下用于收集 交付的文档 doc docid 15 deliverynum 123 text txxxxxx date 2019 07 18T12 37 58Z docid 16 deliverynum 456 text txxx
  • 如何在sqlite中使用填充连接字符串

    我的 sqlite 表中有三列 Column1 Column2 Column3 A 1 1 A 1 2 A 12 2 C 13 2 B 11 2 我需要选择Column1 Column2 Column3 e g A 01 0001 我想用一
  • 在 C 中按值传递结构而不是传递指针有什么缺点吗?

    在 C 中按值传递结构而不是传递指针有什么缺点吗 如果结构体很大 显然会存在复制大量数据的性能问题 但对于较小的结构体 它基本上应该与将多个值传递给函数相同 当用作返回值时 它可能会更有趣 C 函数只有单个返回值 但您通常需要多个返回值 因
  • 如何在不重新加载页面的情况下从数据库获取数据?

    当用户提出任何显示在分区顶部的问题时 我想制作一个常见问题解答面板 而无需重新加载页面 因为我认为我必须每隔几秒就与数据库建立连接 现在的问题是如何在不重新加载页面的情况下建立连接以及如何显示新问题 您有两个选择 Ajax 它允许您使用 J
  • 如何应用 CSS 进行打印?

    我正在尝试在我的页面之一中打印 div 但打印时无法应用 css 在样式标签内写入 media print 不起作用 我应该怎么办 使用以下
  • Java 泛型和 Groovy 重载

    我使用 Groovy JUnit 和 EasyMock 为 Java 应用程序编写单元测试 EasyMock中有几个重载方法capture 已弃用 并附有注释 由于强制擦除更困难 无法在 Java 7 中编译 这些方法将类型的对象作为参数C
  • data.table 聚合操作中的进度条

    ddply has a progress要在运行时获得进度条 是否有等效的data table in R 是的 您可以使用任何您想要的进度状态 library data table dt data table a 1 4 b c a b d
  • 一页上有两个分析

    如何在一个网站上放置两个 GA 代码 我有这个代码 function i s o g r a m i GoogleAnalyticsObject r i r i r function i r q i r q push arguments i
  • 将 NSDictionary 键排序为 NSDate

    我正在使用最新的 SDK 和 XCode 4 2 开发 iOS 4 应用程序 我有一个NSMutableDictionary where keys are NSDate and values are NSMutableString 当我填满
  • 如何在Android上设置语音识别的语言?

    我一直在android中研究语音识别API 发现当语言设置更改时 语音结果会发生变化 有没有办法以编程方式设置它 或者是否打算在语音语言设置屏幕上午餐 或者还有什么 笔记 我尝试额外使用这个意图 intent putExtra Recogn
  • c++ 如何转发声明一个继承自另一个类的类?

    我创建了一个具有一堆继承类 父类 的类 以便我可以使用多态性 但问题是有两个类相互调用 因此 我需要转发声明它们 并且我可以转发声明一个类 但是当我转发声明继承的类时 编译器表示它无法将指针从一个类更改为另一个类 有没有办法对继承的类进行前
  • 根据表单中的多个列表框过滤查询

    我有一个包含两个表的 Access 数据库 联系人 和 国家 地区 其中每个都包含多个字段 我有一个查询 Filter 它将这两个表组合在一起 我想创建一个表单 其中的列表框数量与查询中的字段数量一样多 用户可以打开表单并从每个列表框中选择
  • 我可以创建一个 XSD 架构来为所有复杂类型放置一个属性吗?

    我想创建一个 XSD 来定义一个属性 该属性可以放置在其他架构中的元素或不属于任何架构中的元素上 例如 架构看起来像这样
  • java流中遇到顺序保存

    我已经经历过相关问题 例如如何确保java8流中的处理顺序 我仍然不完全清楚输出元素的顺序 因此请澄清我以下的疑问 Integer intArray 1 2 3 4 5 6 7 8 List