【问题标题】:Is the error reporting in Collectors.toMap() broken? [duplicate]Collectors.toMap() 中的错误报告是否损坏? [复制]
【发布时间】:2018-03-29 13:04:38
【问题描述】:
List<String> strings = Arrays.asList("3","55","3");
Map<String,Integer> map = strings
    .stream()
    .collect(Collectors.toMap(s ->s, s -> s.length()));

返回

java.lang.IllegalStateException: Duplicate key 1

我期望的重复键 3

【问题讨论】:

  • 复制到 1.8.0u152。似乎记录了HashMap$Nodevalue 而不是它的key...
  • 注意,如果你做Collectors.toMap(s -&gt;s, s -&gt;4),你会得到java.lang.IllegalStateException: Duplicate key 4,所以看起来它实际上是在抱怨值重复
  • @Zircon 有趣的是,您链接到的错误被标记为 8040892 的重复,它本身声称已修复。另请参阅其他重复的 8178142。啊。
  • @Mena 并且重复的引用显示“Fix Version/s: 9”-直到 Java 9 才修复。

标签: java java-stream


【解决方案1】:

这在 Java 9 中已修复。现在错误消息是正确的:

java.lang.IllegalStateException: Duplicate key 3 (attempted merging values 1 and 1)

【讨论】:

    【解决方案2】:

    似乎这是 JDK 8 中的一个错误,但在 JDK 9 中不再是这种情况。原因之一是我无法在 JDK 9 上复制它,而@Zircon 提供的两个this link 的原因是关于这个问题和它自 JDK 9 起已修复。

    好像有几个关于这个问题的帖子,另一个链接是:

    https://bugs.openjdk.java.net/browse/JDK-8040892

    这本身就是其他几个帖子的重复。

    【讨论】:

      【解决方案3】:

      是的,这是一个错误,但还有另一种方法可以将其转换为地图,即使用标识函数:

      List<String> strings = Arrays.asList("3","55","3");
      Map<String, List<String>> map = strings.stream()
                      .collect(Collectors.toMap(Function.identity(), Arrays::asList));
      

      这样做你会得到正确的错误是

      java.lang.IllegalStateException: Duplicate key [3]
      

      对于具有唯一值的数组

      List<String> strings = Arrays.asList("3","55","4");
      

      结果是

      {55=[55], 3=[3], 4=[4]}
      

      【讨论】:

      • 这将正确报告重复键,但在没有冲突时不会产生预期的结果。
      • @Holger 同意发布答案后我注意到顺便说一句感谢您指出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2010-11-28
      相关资源
      最近更新 更多