Map<String, String> phoneBook = people.stream()
.collect(toMap(Person::getName,
Person::getAddress));
Me sale java.lang.IllegalStateException: Duplicate key
cuando se encuentra un elemento duplicado.
¿Es posible ignorar tal excepción al agregar valores al mapa?
Cuando hay duplicado, simplemente debe continuar ignorando esa clave duplicada.
java
java-8
java-stream
Patan
fuente
fuente
Respuestas:
Esto es posible utilizando el
mergeFunction
parámetro deCollectors.toMap(keyMapper, valueMapper, mergeFunction)
:mergeFunction
es una función que opera en dos valores asociados con la misma clave.adress1
corresponde a la primera dirección que se encontró al recopilar elementos yadress2
corresponde a la segunda dirección encontrada: esta lambda simplemente le dice que mantenga la primera dirección e ignora la segunda.fuente
null
. Consulte toMap doc que apunta a fusionar doc que indica Si la función de reasignación devuelve nulo, la asignación se elimina.Como se dijo en JavaDocs :
Entonces deberías usar
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
en su lugar. Simplemente proporcione una función de fusión , que determinará cuál de los duplicados se coloca en el mapa.Por ejemplo, si no le importa cuál, simplemente llame
fuente
La respuesta @alaster me ayudó mucho, pero me gustaría agregar una información significativa si alguien está tratando de agrupar la información.
Si tiene, por ejemplo, dos
Orders
con el mismocode
pero diferentequantity
de productos para cada uno, y su deseo es sumar las cantidades, puede hacer:Resultado:
fuente
Para agrupar por objetos
fuente
Para cualquier otra persona que tenga este problema pero sin que se transmitan claves duplicadas en el mapa, asegúrese de que su función keyMapper no devuelva valores nulos .
Es muy molesto rastrear esto porque el error dirá "Duplicar clave 1" cuando 1 es realmente el valor de la entrada en lugar de la clave.
En mi caso, mi función keyMapper intentó buscar valores en un mapa diferente, pero debido a un error tipográfico en las cadenas estaba devolviendo valores nulos.
fuente
He encontrado un problema de este tipo al agrupar objetos, siempre los resolví de una manera simple: realice un filtro personalizado con java.util.Set para eliminar objetos duplicados con cualquier atributo de su elección a continuación
Espero que esto ayude a cualquiera que tenga el mismo problema.
fuente
Asumiendo que tienes personas es una lista de objetos
Ahora necesitas dos pasos:
1)
2)
Aquí hay un método para eliminar duplicados
Agregar un ejemplo completo aquí
Resultados:
fuente