2017-06-20 195 views
0

的Java代码如下:使用parallelStream的foreach创建的HashMap,但有时值为空

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。然后它运行正常,所有的价值都有价值,但我不知道为什么?

+0

'HashMap'的javadoc(https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html)是这个很清楚,“注意,此实现不如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,那么它必须在外部进行同步。 – Misha

回答

2

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

此外,为什么在那里,当流可以为你做?

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

非常感谢!我学会了一种新的写作方式。我这样做是因为我需要根据条件来判断,然后创建两个不同的列表,而我不知道我可以这样做。 –

相关问题