2017-05-05 77 views
3

我有一個流,並且我想明確地將它收集到一個HashMap中。現在,我正在做類似如何將流轉換爲Java 8中的HashMap(非映射)

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

我想知道是否有一種方法使用收集器來顯式取回HashMap。

+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方法的重載之一將允許您選擇您選擇的地圖實現。

不幸的是,這種重載的缺點之一是它也需要一個方法來合併兩個值,當它們具有相同的鍵時(儘管我經常引用一個總是在這種情況下拋出的方法)。

HashMap<K, V> myHashMap = listToTransform.stream().map(/* do my transformation here */) 
.collect(Item::getKey, Item::getValue, this::throwIllegalArgumentException, HashMap::new); 
+0

爲什麼你的示例中的合併函數只是拋出一個異常?你可以把它寫成:'(left,right) - > right',它將作爲key的值的替換*,就像'HashMap'自然會做的那樣... – Eugene

+1

這是另一種選擇。如果我不期望給定密鑰的多個實例,我個人的偏好是在發生這種情況時拋出。那樣的話,我知道我的數據或邏輯實際上有些問題,並且我可以相應地去解決它(而添加'(左,右) - >右'則隱藏了這個事實)。 –

相關問題