2016-05-02 4 views
1

in Java 8 Ich weiß, dass sie den parallelen Strom hinzugefügt, die Vorteile von Multicore-Prozessoren nimmt, und ich weiß, dass Sie es mit etwas wie folgt verwenden:Java 8 | Parallel-Stream für eine HashMap

List<String> list = new ArrayList<String>(); 
list.parallelStream().forEach(str -> System.out.println(str)); 

Aber wie würde ich erreichen so etwas mit einer HashMap?

Map<String, Integer> map = new HashMap<String, Integer>(); 
// won't work, because the Map class doesn't have the .parallelStream() 
map.parallelStream().forEach((str, num) -> System.out.println(str + ":" + num)); 

Weiß jemand, wie man so etwas macht? Danke

Antwort

11

Sie können Map nicht direkt streamen, aber Sie können seinen Eintragssatz streamen, der mit the entrySet() method gegeben ist. Extrahieren Sie den Schlüssel und den Wert aus dem Eintragsobjekt.

map.entrySet() 
    .parallelStream() 
    .forEach(entry -> System.out.println(entry.getKey() + ":" + entry.getValue())); 
+0

ja, aber würde nicht die '.getValue()' Abnahme der Preformance aufrufen? –

+1

Verglichen mit was? Ein Teil des Codes muss den Wert (und den Schlüssel) aus dem Eintrag extrahieren. – rgettman

+2

@John S .: Vielleicht verwechseln Sie 'Map.Entry.getValue' mit' Map.get'. Der Aufruf von "getValue" ist hier nicht identisch mit einer 'Map'-Suche. Während es abhängig von der Kartenimplementierung ist, stellt ein Eintrag normalerweise eine Art von aufgelöstem Mapping mit billigen Methoden 'getKey' und 'getValue' dar, dh im Falle von 'java.util.HashMap' sprechen wir davon, ein Feld aus dem Eintrag zu lesen Instanz, nicht über eine Hash-Suche. – Holger

1

Sie können die 'Eintrag Set' aus dem Hash-Karte erhalten, indem map.entrySet() aufrufen, können Sie parallelStream() auf der zurückgegebenen Eintrag Satz nennen.

Bitte beachten Sie, dass das zurückgegebene Objekt eine Reihe von Map.Entry ist. Sie können den Schlüssel und den Wert aus einem Eintragssatzelement abrufen, indem Sie getKey() bzw. getValue() aufrufen. Wie folgt:

Map<String, Integer> map = new HashMap<String, Integer>(); 
map.put("a", 1); 
map.put("b", 2); 
map.entrySet().parallelStream().forEach((e) -> System.out.println(e.getKey() + ":" + e.getValue()));