java中collection和collections的区别,collect() java_java-确保可以在并行流上订购.collect吗?

 2023-09-25 阅读 28 评论 0

摘要:TL; DRjava中collection和collections的区别。是的,订单得到保证。Stream.collect()API文档出发点是看什么决定减少是否同时发生。 Stream.collect()的描述如下:如果流是并行的,并且CH_ID是并发的,并且流是无序的或收集器是无序的,则将执行

TL; DR

java中collection和collections的区别。是的,订单得到保证。

Stream.collect()API文档

出发点是看什么决定减少是否同时发生。 Stream.collect()的描述如下:

如果流是并行的,并且CH_ID是并发的,并且流是无序的或收集器是无序的,则将执行并发缩减(有关并发缩减的详细信息,请参见CH_ID)。

满足第一个条件:流是并行的。 第二和第三个呢:CH_ID是否并发且无序?

Collectors.toList()API文档

CH_ID的文档为:

返回CH_ID,将输入元素累积到新的IDENTITY_FINISH中。不保证返回的CONCURRENT的类型,可变性,可序列化性或线程安全性; 如果需要对返回的UNORDERED进行更多控制,请使用toCollection(Supplier)。

返回值:

一个收集器,按照遇到的顺序将所有输入元素收集到一个列表中

按相遇顺序工作的操作按其原始顺序对元素进行操作。 这将覆盖并行性。

实施代码

检查CH_ID的实现可确认IDENTITY_FINISH不包括CONCURRENT或UNORDERED特征。

public static

Collector> toList() {

return new CollectorImpl<>((Supplier>) ArrayList::new, List::add,

(left, right) -> { left.addAll(right); return left; },

CH_ID);

}

// ...

static final Set CH_ID

= Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));

请注意,收集器如何具有CH_ID特征集,该特征集仅具有单个IDENTITY_FINISH特征。 CONCURRENT和UNORDERED不存在,因此减少不能并发。

非并行减少意味着,如果流是并行的,则收集可以并行进行,但是它将被拆分为多个线程限制的中间结果,然后将其合并。 这样可以确保组合结果按相遇顺序排列。

另请参阅:为什么在Java 8中按顺序收集并行流

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/2/95199.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息