Collectors.toMap()中的错误报告是否已损坏?

时间:2018-03-29 13:04:39

标签: java java-stream

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

似乎,这是JDK 8中的一个错误,但不再是JDK 9的情况。原因之一是我无法在JDK 9上复制它并且导致@Zircon提供的两个this link得出关于问题并且从JDK 9开始修复。

似乎有关于此问题的几篇帖子,另一个链接是:

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

本身就是其他一些帖子的副本。

答案 2 :(得分:0)

是的,它是一个错误,但还有另一种方法可以通过身份函数将其转换为地图:

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