如何在Java8中将流转换为HashMap(而不是Map)

如何在Java8中将流转换为HashMap(而不是Map),java,java-8,hashmap,java-stream,Java,Java 8,Hashmap,Java Stream,我有一个流,我想显式地将它收集到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.

我有一个流,我想显式地将它收集到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。

收集器的重载之一。toMap方法将允许您选择一个映射实现

不幸的是,这种重载的缺点之一是,当两个值具有相同的键时,它还需要一个方法来合并它们,尽管我经常引用一个在这种情况下总是抛出的方法

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

您可以与供应商函数一起使用。为什么示例中的合并函数只是抛出一个异常?您可以将其编写为:left,right->right,它将充当键值的替换-就像HashMap自然做的那样…这是另一个选项。我个人的偏好是,如果一个给定密钥的实例不超过一个,则在出现这种情况时抛出。这样,我知道我的数据或逻辑实际上出了问题,我可以去相应地修复它,而添加left,right->right会对我隐藏这个事实。