栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Java流中遇到订单保留

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Java流中遇到订单保留

货源的无序性质或订单合同的显式释放

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/453781.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号