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

是否可以确保在并行流上订购.collect?

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

是否可以确保在并行流上订购.collect?

TL; DR

是的,订单得到保证。

Stream.collect()API文档

出发点是看什么决定减少是否同时发生。

Stream.collect()
的描述如下:

如果该流是并行的,并且

Collector
是并发的,或者该流是无序的或收集器是无序的,那么将执行并发缩减(请参阅
Collector
有关并发缩减的详细信息。)

满足第一个条件:流是并行的。第二个和第三个如何:

Collector
并发和无序?

Collectors.toList()API文档

toList()
的文档内容如下:

返回一个

Collector
,将输入元素累积到一个new中
List
。无法保证返回的类型,可变性,可序列化性或线程安全性
List
;如果
List
需要对返回的内容进行更多控制,请使用
toCollection(Supplier)

返回:
一个收集器, 以遇到的顺序 将所有输入元素收集到一个List

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

实施代码

检查实施

Collectors.java
确认
toList()
没有 包含
CONCURRENT
UNORDERED
特征。

public static <T>Collector<T, ?, List<T>> toList() {    return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,         (left, right) -> { left.addAll(right); return left; },         CH_ID);}// ...static final Set<Collector.Characteristics> CH_ID        = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));

注意收集器如何具有

CH_ID
特征集,该特征集仅具有单个
IDENTITY_FINISH
特征。
CONCURRENT
并且
UNORDERED
不存在,因此减少不能并发。

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



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

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

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