Map<String, String> phoneBook = people.stream()
.collect(toMap(Person::getName,
Person::getAddress));
Я получаю, java.lang.IllegalStateException: Duplicate key
когда дублированный элемент найден.
Можно ли игнорировать такое исключение при добавлении значений на карту?
Когда есть дубликат, он просто должен продолжаться, игнорируя этот дубликат ключа.
java
java-8
java-stream
Patan
источник
источник
Ответы:
Это возможно с помощью
mergeFunction
параметраCollectors.toMap(keyMapper, valueMapper, mergeFunction)
:mergeFunction
это функция, которая работает с двумя значениями, связанными с одним и тем же ключом.adress1
соответствует первому адресу, который был обнаружен при сборе элементов, иadress2
соответствует второму обнаруженному адресу: эта лямбда просто говорит сохранить первый адрес и игнорирует второй.источник
null
. См. Документ toMap , указывающий на объединение документа, в котором говорится, что если функция переназначения возвращает ноль, отображение удаляется.Как сказано в JavaDocs :
Поэтому вы должны использовать
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
вместо этого. Просто предоставьте функцию слияния , которая определит, какой из дубликатов будет добавлен на карту.Например, если вам все равно, просто позвоните
источник
Ответ @alaster мне очень помогает, но я хотел бы добавить содержательную информацию, если кто-то пытается сгруппировать информацию.
Если у вас есть, например, два
Orders
с одинаковыми,code
но разнымиquantity
продуктами для каждого, и вы хотите суммировать количество, вы можете сделать:Результат:
источник
Для всех, кто столкнулся с этой проблемой, но без дублирования ключей на карте, убедитесь, что ваша функция keyMapper не возвращает нулевые значения .
Это очень раздражает, потому что ошибка скажет «Дублировать ключ 1», когда 1 на самом деле является значением записи, а не ключа.
В моем случае моя функция keyMapper пыталась найти значения на другой карте, но из-за опечатки в строках возвращала нулевые значения.
источник
Для группировки по объектам
источник
Я столкнулся с такой проблемой при группировке объектов, я всегда разрешал их простым способом: выполнял пользовательский фильтр, используя java.util.Set, чтобы удалить дублирующийся объект с любым атрибутом по вашему выбору, как показано ниже.
Надеюсь, что это помогает всем, кто испытывает ту же проблему!
источник
Предполагая, что у вас есть люди, список объектов
Теперь вам нужно сделать два шага:
1)
2)
Вот метод удаления дубликатов
Добавляем полный пример сюда
Полученные результаты :
источник