Map<String, String> phoneBook = people.stream()
.collect(toMap(Person::getName,
Person::getAddress));
Recebo java.lang.IllegalStateException: Duplicate key
quando um elemento duplicado é encontrado.
É possível ignorar essa exceção ao adicionar valores ao mapa?
Quando houver duplicado, ele simplesmente deve continuar ignorando essa chave duplicada.
java
java-8
java-stream
Patan
fonte
fonte
Respostas:
Isso é possível usando o
mergeFunction
parâmetro deCollectors.toMap(keyMapper, valueMapper, mergeFunction)
:mergeFunction
é uma função que opera em dois valores associados à mesma chave.adress1
corresponde ao primeiro endereço encontrado ao coletar elementos eadress2
corresponde ao segundo endereço encontrado: este lambda apenas informa para manter o primeiro endereço e ignora o segundo.fonte
null
. Consulte o documento toMap que aponta para mesclar o documento que declara Se a função de remapeamento retornar nulo, o mapeamento será removido.Como dito no JavaDocs :
Então você deve usar em seu
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
lugar. Basta fornecer uma função de mesclagem , que determinará qual das duplicatas será colocada no mapa.Por exemplo, se você não se importa com qual, basta ligar
fonte
A resposta @alaster me ajuda muito, mas eu gostaria de adicionar informações importantes se alguém estiver tentando agrupar as informações.
Se você tem, por exemplo, dois produtos
Orders
iguais para cada um,code
mas diferentesquantity
, e seu desejo é somar as quantidades, é possível:Resultado:
fonte
Para agrupar por objetos
fonte
Para qualquer outra pessoa que esteja recebendo esse problema, mas sem que chaves duplicadas no mapa sejam transmitidas, verifique se a função keyMapper não está retornando valores nulos .
É muito chato rastrear isso porque o erro diz "Chave duplicada 1" quando 1 é realmente o valor da entrada em vez da chave.
No meu caso, minha função keyMapper tentou procurar valores em um mapa diferente, mas devido a um erro de digitação nas strings estava retornando valores nulos.
fonte
Eu encontrei esse problema ao agrupar objetos, sempre os resolvia de uma maneira simples: execute um filtro personalizado usando um java.util.Set para remover objetos duplicados com qualquer atributo de sua escolha, conforme abaixo
Espero que isso ajude alguém com o mesmo problema!
fonte
Supondo que você tenha pessoas é Lista de objetos
Agora você precisa de duas etapas:
1)
2)
Aqui está o método para remover duplicado
Adicionando exemplo completo aqui
Resultados :
fonte