【问题标题】:Use parallelStream foreach to create HashMap, But sometimes value is empty使用parallelStream foreach创建HashMap,但有时value为空
【发布时间】:2017-06-20 04:03:16
【问题描述】:

Java 代码喜欢:

List<Detail> DbDetails = ... Like 50000 rows records
Map<Long, List<Detail>> details = new HashMap();

DbDetails .parallelStream().forEach(detail -> {
        Long id = detail.getId();
        details.computeIfAbsent(id, v -> new ArrayList<>()).add(detail);

    });

Then ...

details.entrySet().stream().forEach(e -> {
        e.getValue(); // Some value is empty
    });

我猜是因为 HashMap 是线程不安全的,所以我使用 Hashtable 代替它。然后它运行正常,所有值都有值,但我不知道为什么?

【问题讨论】:

标签: java thread-safety java-stream


【解决方案1】:

HashMap 不是线程安全的,所以不要使用并行流。

此外,当流可以为您做到这一点时,为什么要在那里这样做?

DbDetails.parallelStream().collect(Collectors.groupingBy(Detail::getId))

【讨论】:

  • 非常感谢!!我学会了一种新的写作方式。我这样做是因为我需要根据条件判断然后创建两个不同的列表,我不知道我可以这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多