2017-06-20 52 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

非常感謝!我學會了一種新的寫作方式。我這樣做是因爲我需要根據條件來判斷,然後創建兩個不同的列表,而我不知道我可以這樣做。 –

相關問題