Collectors.toMap() 中的错误报告是否存在问题?

11
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
使用1.8.0u152进行复制。它似乎记录了HashMap$Nodevalue而不是它的key... - Mena
1
请注意,如果您执行Collectors.toMap(s ->s, s ->4),则会收到java.lang.IllegalStateException: Duplicate key 4的错误提示,因此似乎实际上是在抱怨值重复。 - Bentaye
5
请查看 https://bugs.openjdk.java.net/browse/JDK-8173464。 - Zircon
@Zircon有趣的是,你链接中的错误已被标记为[8040892](https://bugs.openjdk.java.net/browse/JDK-8040892)的重复项,该问题本身据称已经得到解决。请参见其他的重复项[8178142](https://bugs.openjdk.java.net/browse/JDK-8178142)。马上。 - Mena
2
@Mena和重复引用显示“修复版本/ s:9”-直到Java 9才得以修复。 - Zircon
@Zircon 哦,好的 :) 那就可以把所有东西都放进一个答案里了! - Mena
3个回答

2

这个问题在Java 9中已经得到修复。现在错误信息是正确的:

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

1
似乎这是JDK 8中的一个错误,但自JDK 9以来不再是这种情况。原因之一是我无法在JDK 9上复制它,原因之二是@Zircon提供的this link关于问题的派生和其在JDK 9中被修复。
似乎已经有几篇文章涉及此问题,另一个链接是:

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

它本身是其他帖子的副本。


0

是的,这是一个bug,但还有另一种将其转换为映射的方法,那就是使用身份函数:

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]}

1
这将正确报告重复的键,但在没有冲突时不会产生预期的结果。 - Holger
@Holger 在发布答案后我注意到了,顺便感谢您指出。 - Eshu

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