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中按顺序收集并行流
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态