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

3
我有一个流,我想明确地将它收集到 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()));

我想知道是否有一种使用Collectors显式获取HashMap的方法。

1
你可以使用 Collectors.toMap 和一个供应函数。 - khelwood
1个回答

6

Collectors.toMap方法的一个重载版本允许您选择自己喜欢的映射实现。

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

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

为什么你的示例中合并函数只是抛出异常?你可以将其编写为:(left, right) -> right,它将充当键值替换的replace - 就像HashMap自然地执行的那样... - Eugene
1
那是另一种选择。如果我不期望有多个给定键的实例,我的个人偏好是在发生这种情况时抛出异常。这样,我就知道我的数据或逻辑确实存在问题,我可以相应地进行修复(而添加 (left,right) -> right 则会隐藏这个事实)。 - Joe C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接