当前位置: 首页 > 面试题库 >

在Java流中遇到订单保留

松鸣
2023-03-14
问题内容

我经历了相关的问题,例如如何确保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和)map,没有任何区别,但是操作skiplimit和)distinct可能会根据先前的流状态是有序还是无序而表现出不同的行为。此答案显示了一个示例如何distinct受先前事件影响的示例unordered()

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

该答案提供了一种打印流的特性并评估它们由于附加其他操作而如何变化的方法

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

原则上,终端操作的无序性质可以用来影响之前的阶段,但因为无状态的中间操作不会反正影响和skiplimitdistinct必须遵守先前的有序状态,如果存在的话,可能受到影响的唯一操作,是sorted如果后续操作无论如何都不在乎订单,则这变得过时了。

在当前的实现中,自Java
8更新60起,终端操作的无序性质不会影响先前阶段的行为。与以前的实现方式一样,进行了此更改,并且错误地影响了skiplimit。放任放弃过时的分类步骤的机会不被认为是问题,因为sort与无序的后续操作进行链接是一个极端的情况。如果您想进一步了解相关讨论,请参阅此答案,包括评论。

因此对于

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特性的评估?
”是的,是的,这是在开始实际处理之前,通过为流水线阶段选择适当的算法来完成的,但有选择的话,但是此过程不一定会导致整个流水线具有单个特征。



 类似资料:
  • 返回的迭代器是否保证按该顺序提供值 、、? 我知道和保证集合的值顺序正确。此外,我并不是在问如何从迭代器生成流。

  • 订货 流可能有定义的遭遇顺序,也可能没有。流是否具有遭遇顺序取决于源和中间操作。某些流源(如列表或数组)是内在有序的,而其他流源(如HashSet)则不是。一些中间操作(如sorted())可能会对无序的流施加遭遇顺序,而另一些操作可能会使有序的流无序,如baseStream.unordered()。此外,一些终端操作可能会忽略遭遇顺序,如forEach()。 null

  • 我有以下方法,这是预期的工作。 但是有没有办法修改它,这样我就不必单独订阅网络客户的电话了 取而代之的是让它成为流量的一部分,并且只从某个订户那里订阅一次? 请注意,这最终必须返回一个可观察的 一些外部订户将执行以下操作。 ; 我希望这能触发整个流程,这也会触发webclient的调用,而不是像上面那样单独调用它。 这可能吗? 因此,寻找类似以下内容的内容,而不是单独订阅webClient。 尝试

  • 问题内容: 我有PostgreSQL数据库,我尝试打印所有用户(人)。 当我执行此查询时 我得到所有车主按汽车数量排序 输出: 当我尝试链接所有者ID时,所有订单都出错了。 输出:和其他数据 你看比命令是错误的。所以这是我的问题,我该如何保存该订单? 问题答案: 解开混乱。先汇总,然后再加入: 无需加入两次。如果您计数 最多或所有行, 这应该是最快的。 对于 较小的选择 , 相关子查询 更快: 至

  • 如果这个问题是重复的,我很抱歉,但我已经在这个网站上跟踪了很多页面,试图找到一个答案,但我还没有找到一个可行的答案。我使用过的一些页面包括: PyGame鼠标点击检测 自己找不到rect? 如何碰撞。pygame中的rect工作 这可能是我缺乏编码理解,如果是这样,我道歉。然而,我发现最“有帮助”的页面是第一个链接。用树懒的第一个回答,这似乎很简单,也是我能做的事情。一旦他的方法不起作用,我试着在

  • 问题内容: 我正在尝试玩 文件如此[处(1)])和here(2)所述。 (1)一个不好的例子: 第一种方法可行,但我不想依赖某些东西。第二个结果是仅播放了一些前导帧,听起来更像是单击。从ByteArrayInputStream播放时,不会是IO问题。 请与您分享为什么会发生这种情况。TIA。 问题答案: 我不确定为什么您链接的第二种方法会启动另一个线程;我相信音频还是会以自己的方式播放。剪辑播放完