2017-06-20 3 views
0

code Java comme:Utilisez parallelStream foreach pour créer HashMap, mais parfois la valeur est vide

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 
    }); 

Je suppose que parce que HashMap est thread-dangereux, donc j'utiliser Hashtable au lieu de. Alors ça marche ok, toute la valeur a de la valeur, mais je ne sais pas pourquoi?

+0

'HashMap' javadoc (https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html) est assez clair à ce sujet, « Notez que cette mise en œuvre n'est pas Si plusieurs threads accèdent simultanément à une table de hachage, et qu'au moins l'un des threads modifie structurellement la map, il doit être synchronisé de manière externe. " – Misha

Répondre

2

HashMap n'est pas compatible avec les threads, n'utilisez donc pas de flux parallèles avec celui-ci. En outre, pourquoi faire cela, quand les flux peuvent le faire pour vous?

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

Merci beaucoup !! J'ai appris une nouvelle façon de l'écrire. Je fais cela parce que j'ai besoin de juger par les conditions alors créer deux listes différentes, Et je ne savais pas que je pouvais faire comme ça. –