Ответ 1
Это было исправлено в Java 9. Теперь сообщение об ошибке правильное:
java.lang.IllegalStateException: Duplicate key 3 (attempted merging values 1 and 1)
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
Это было исправлено в Java 9. Теперь сообщение об ошибке правильное:
java.lang.IllegalStateException: Duplicate key 3 (attempted merging values 1 and 1)
Похоже, это было ошибкой в JDK 8, но это уже не так, как в JDK 9. Причина в том, что я не могу воспроизвести ее на JDK 9, а причина вторая, эта ссылка, предоставленная @Zircon, выдает о проблеме и фиксируется как JDK 9.
Похоже, было несколько сообщений об этой проблеме, другая ссылка:
https://bugs.openjdk.java.net/browse/JDK-8040892
который сам является дубликатом нескольких других сообщений.
Да, это ошибка, но есть другой способ ее преобразования в карту, которая использует функцию идентификации:
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]}