Является ли сообщение об ошибке в Collectors.toMap() сломанным?

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

Это было исправлено в Java 9. Теперь сообщение об ошибке правильное:

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

Ответ 2

Похоже, это было ошибкой в JDK 8, но это уже не так, как в JDK 9. Причина в том, что я не могу воспроизвести ее на JDK 9, а причина вторая, эта ссылка, предоставленная @Zircon, выдает о проблеме и фиксируется как 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]}