Java Collectors.toMap IllegalStateException:无法复制时复制密钥

Java Collectors.toMap IllegalStateException:无法复制时复制密钥,java,exception,java-stream,Java,Exception,Java Stream,我不断地碰到这个错误,我无法理解它,因为它抱怨一个值正好出现一次 Exception in thread "main" java.lang.IllegalStateException: Duplicate key wp-admin/admin-ajax.php#13236 at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) at java.util.HashMap.merge(HashMap.ja

我不断地碰到这个错误,我无法理解它,因为它抱怨一个值正好出现一次

Exception in thread "main" java.lang.IllegalStateException: Duplicate key wp-admin/admin-ajax.php#13236
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1245)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at <my code>
然而,它抱怨的价值只存在一次。验证代码:

List<String> usefulLines =
    reader.lines().filter(line -> line.startsWith(TAG_MAPPED_NODE)).collect(Collectors.toList());
List<String> trouble =
    usefulLines.stream().filter(line -> line.contains("wp-admin/admin-ajax.php#13236")).collect(Collectors.toList());
System.out.println("Trouble size: " + trouble.size());
return usefulLines.stream().map(line -> {
    final String[] splitted = line.split(" ");
    if (splitted.length != 3)
        throw new IllegalStateException("Unexpected line: " + line);
    return splitted;
}).collect(Collectors.toMap(t -> t[1], t -> t[2]));
列出可用的行=
reader.lines().filter(line->line.startsWith(TAG_-MAPPED_节点)).collect(Collectors.toList());
列出问题=
usefulLines.stream().filter(line->line.contains(“wp admin/admin ajax.php#13236”)).collect(Collectors.toList());
System.out.println(“故障大小:+Trouble.size());
返回usefulLines.stream().map(行->{
最后一个字符串[]splitted=line.split(“”);
如果(拆分的长度!=3)
抛出新的IllegalStateException(“意外行:+行”);
返回分裂;
}).collect(Collectors.toMap(t->t[1],t->t[2]);
输出为:
故障大小:1

因此,只有一个条目具有此值(我必须补充,我将其存储在映射的值端,而不是键)

系统配置:

  • Java版本:openjdk版本“1.8.0_72”
  • IDE:IntelliJ IDEA 2016.1
  • OS:Fedora 22 64位

那我到底是怎么得到这个例外的呢?这在我看来像是一个JDK bug-有人看到我做错了什么吗?

我的解决方案是用番石榴的替换bug
Collectors.toMap()
。耶

正如在对这个问题的评论中指出的,这里的混乱是由于Java8()中的一个bug造成的。当存在重复键时,该值将作为重复项而不是键打印出来

因此,实际上存在一个重复的键,但它不是异常消息中显示的值。在这种特定情况下,映射到“wp admin/admin ajax.php#13236”的任何键都是重复的


这个错误从Java9开始就被修复了。

返回拆分;(拆分[1],拆分[2])这合法吗?请参阅。在这里,您可以做一件非常有用的事情,那就是准确地找出
reader.lines()
中的内容,将其保存到文本文档或其他文件中,然后将其发布到此处,以便我们真正了解您的数据。另外,请发布异常的整个堆栈跟踪,而不仅仅是类名和消息。键是重复的,但错误中显示的是一个值。这个问题已经众所周知了(),应该已经解决了,但在最近的OpenJDK版本中,这个问题似乎还没有得到解决8@malaverdiere当前位置不要害怕将其作为答案发布并接受……这可能会对未来的谷歌用户有所帮助。
List<String> usefulLines =
    reader.lines().filter(line -> line.startsWith(TAG_MAPPED_NODE)).collect(Collectors.toList());
List<String> trouble =
    usefulLines.stream().filter(line -> line.contains("wp-admin/admin-ajax.php#13236")).collect(Collectors.toList());
System.out.println("Trouble size: " + trouble.size());
return usefulLines.stream().map(line -> {
    final String[] splitted = line.split(" ");
    if (splitted.length != 3)
        throw new IllegalStateException("Unexpected line: " + line);
    return splitted;
}).collect(Collectors.toMap(t -> t[1], t -> t[2]));