java - 由并行流填充的 ArrayList 包含空值

标签 java java-8 java-stream

我正在创建一个列表并使用并行流从另一个列表中填充它,意外地目标列表包含空值。它很少发生,而且经常发生。有人有同样的问题吗?

这是一段代码:

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/

相关文章:

java - 如何按嵌套映射值对外部映射进行排序

java - 缺少库或代码不正确? Android Studio,APK 崩溃

java - ArrayOutOfBoundsException : asm. ClassReader.readClass(未知来源)

java - OCR Tesseract 没有通过 super.OnCreate() 调用,尽管它是

Java Lambda 捕获还是重新执行?

parsing - 使用java 8中的流读取空格分隔的文本文件的第一列

java - 在 Java 中深度复制 NavigableMap

java-8 - java8 stream - 过滤映射和聚合

java - 如何将我的程序拆分为多个类?

java - 解决 Windows Server 上的高 CPU 使用率问题