我正在创建一个列表并使用并行流从另一个列表中填充它,意外地目标列表包含空值。它很少发生,而且经常发生。有人有同样的问题吗?
这是一段代码:
Collection<DestinationObj> DestinationObjList = Lists.newArrayList();
SourceObjList.parallelStream().forEach(portalRule -> DestinationObjList.add(new DestinationObj(portalRule)));
return DestinationObjList;
最佳答案
您应该以稍微不同的方式并行收集:
SourceObjList.parallelStream()
.map(DestinationObj::new)
.collect(Collectors.toCollection(ArrayList::new));
您遇到的问题是 ArrayList
不是线程安全的,因此结果实际上是未定义的。
请注意,使用并行流不需要线程安全的集合 - Lists::newArrayList
不是。
关于java - 由并行流填充的 ArrayList 包含空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43230375/