货源的无序性质或订单合同的显式释放
unordered()可能会影响所有后续的流水线阶段,除非它们引入只能在
sorted*** 作中发生的订单。
对于无状态中间 *** 作(例如
filter和)
map,没有任何区别,但是 *** 作
skip(
limit和)
distinct可能会根据先前的流状态是有序还是无序而表现出不同的行为。此答案显示了一个示例如何
distinct受先前事件影响的示例
unordered()。
请注意,原则上,
sorted在引入顺序时,可能取决于前一阶段的有序状态,因为如果前一流是无序的,则它可能使用不稳定的排序算法。
该答案提供了一种打印流的特性并评估它们由于附加其他 *** 作而如何变化的方法。
链接终端 *** 作时,终端 *** 作本身的无序性质或终端 *** 作之前最后阶段的无序状态都可能足以为终端 *** 作选择不尝试保留顺序的算法。
原则上,终端 *** 作的无序性质可以用来影响之前的阶段,但因为无状态的中间 *** 作不会反正影响和
skip,
limit,
distinct必须遵守先前的有序状态,如果存在的话,可能受到影响的唯一 *** 作,是
sorted如果后续 *** 作无论如何都不在乎订单,则这变得过时了。
在当前的实现中,自Java
8更新60起,终端 *** 作的无序性质不会影响先前阶段的行为。与以前的实现方式一样,进行了此更改,并且错误地影响了
skip和
limit。放任放弃过时的分类步骤的机会不被认为是问题,因为
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特性的评估?
”是的,是的,这是在开始实际处理之前,通过为流水线阶段选择适当的算法来完成的,但有选择的话,但是此过程不一定会导致整个流水线具有单个特征。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)