首页 > 解决方案 > 为什么 Collectors.toMap (在 JDK8 java.util.stream 中)不允许使用相同的密钥?

问题描述

如果我们将两个 kv 对放入具有相同键的 hashmap 中,则第二个值将覆盖第一个值。但是如果我们通过 Collectors.toMap 执行此操作,它将抛出异常并显示消息:“重复键”。

我知道如何解决它,但我想知道为什么收藏家会这样设计。

标签: javajava-8hashmapjava-streamcollectors

解决方案


使用map.put(key, value),即使新条目替换现有条目,您也不会丢失任何信息。那是因为该方法返回旧值,所以如果您不使用返回值,您只会丢失信息,并且该方法无法检测您是否使用,并且它们不能强迫您。

使用Collectors.toMap(keyMapper, valueMapper),如果存在重复键,信息将丢失。为了安全起见,它将通过抛出异常来拒绝重复的键。您可以通过提供 amergeFunction作为第三个参数来显式忽略旧值来接受重复键,例如使用 lambda 表达式(a,b) -> b丢弃旧值。在这里,他们有能力强迫你考虑这个问题。


推荐阅读