2016-05-02 26 views
1

私は、彼らがマルチコアプロセッサを活用する並列ストリームを追加したことを知っている、と私はあなたがこのような何かでそれを使用することができることを知っている:Java 8 | HashMapのパラレルストリームのJava 8で

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

しかし、私はどのように達成しますこのような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)); 

誰もこのようなことを知っていますか?ありがとう

答えて

11

Mapを直接ストリーミングすることはできませんが、the entrySet() methodで与えられたエントリセットをストリーミングできます。エントリオブジェクトからキーと値を抽出します。

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

はい、しかし、 '.getValue()'減少の前提を呼び出すことはありませんか? –

+1

何に比べて?コードの一部は、エントリから値(およびキー)を抽出する必要があります。 – rgettman

+2

@ John S .: Map.Entry.getValueと 'Map.get'を混同しているかもしれません。ここで 'getValue'を呼び出すことは、' Map'ルックアップと同じではありません。これはマップの実装に依存しますが、通常、エントリは安価な 'getKey'メソッドと' getValue'メソッドを持つ解決されたマッピングの一種を表します。つまり、java.util.HashMapの場合、エントリからフィールドを読み込むことですハッシュルックアップではなくインスタンスです。 – Holger

1

あなたはmap.entrySet()を呼び出すことによって、ハッシュマップから「エントリーセット」を取得することができ、あなたは、返されたエントリのセットにparallelStream()を呼び出すことができます。

返されるオブジェクトは、Map.Entryのセットであることに注意してください。エントリセット項目からキーと値を取得するには、それぞれgetKey()とgetValue()を呼び出します。次のように:

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