Создать карту с помощью SimpleEntry и StreamEx

Я видел пример StreamEx, который довольно хорош и который выглядит так

    Map<String, String> toMap = StreamEx.of(splittedTimeUnit1)
            .pairMap((s1, s2) -> s1.matches("-?\\d+(\\.\\d+)?") ? new String[]{s2, s1} : null)
            .nonNull()
            .toMap(a -> a[0], a -> a[1]);

Это хорошо работает, и мой вывод {seconds=1, minutes=1} это нормально. Не идеально, потому что я должен преобразовать число позже.

Я пытался оптимизировать с SimpleEntry<String,Integer>:

    Map<String, String> toMap2 = StreamEx.of(splittedTimeUnit1)
            .pairMap((s1, s2) -> s1.matches("-?\\d+(\\.\\d+)?") ? new SimpleEntry<>(s1,s2) : null)
            .nonNull()
            .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

который компилируется, но теперь у меня есть проблема, что некоторые значения помещаются в карту несколько раз, что приводит к Exception in thread "main" java.lang.IllegalStateException: Duplicate key minutes

Как я могу это исправить?

РЕДАКТИРОВАТЬ

Глупая ошибка: я забыл переключить s1 и s2 на втором примере

Map<String, String> toMap2 = StreamEx.of(splittedTimeUnit1)
                    .pairMap((s1, s2) -> s1.matches("-?\\d+(\\.\\d+)?") ? new SimpleEntry<>(s2,s1) : null)
                    .nonNull()
                    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

1 ответ

Решение

Утверждение кажется правильным, я думаю проблема была в том, что я забыл переключить s1 и s2. Если я переключу их, все работает как положено, спасибо.

Другие вопросы по тегам