2017-05-05 14 views
3

ストリームがあり、明示的にHashMapに収集したいと思います。今、私は明示的にHashMapを取り戻すためにコレクターを使用する方法があった場合、私は思っていたストリームをJavaのHashMap(マップではない)に変換する方法8

List<Item> listToTransform = //initialized and populated 
HashMap<K, V> myHashMap = new HashMap<>(); 
listToTransform.stream().map(/* do my transformation here */) 
.forEach(i -> myHashMap.put(i.getKey(), i.getValue())); 

ようなものをやっています。

+1

[ 'Collectors.toMap'](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util .function.Function-java.util.function.Function-java.util.function.BinaryOperator-java.util.function.Supplier-)をサプライヤ関数に置き換えます。 – khelwood

答えて

6

Collectors.toMapメソッドへのオーバーロードの1つは、あなたが選択したマップ実装を選択することができます。

残念ながら、このオーバーロードの欠点の1つは、同じキーを持つときに2つの値をマージするメソッドが必要だということです(ただし、その場合常にスローするメソッドを頻繁に参照します)。

HashMap<K, V> myHashMap = listToTransform.stream().map(/* do my transformation here */) 
.collect(Item::getKey, Item::getValue, this::throwIllegalArgumentException, HashMap::new); 
あなたが使用することができます
+0

あなたの例のマージ関数が例外を投げているのはなぜですか? '(left、right) - > right'と書くことができ、' HashMap'と同じようにキーの値の* replace *として動作します。 – Eugene

+1

これは別のオプションです。私の個人的な好みは、もし私が与えられたキーのインスタンスが複数あると予想していなければ、それが起こると投げることです。そうすれば、私のデータや論理には何かが実際には間違っていることが分かりますが、それに応じて修正することができます(ただし、(左、右)→右に追加すると私からこの事実は隠されます)。 –

関連する問題