Map<String, String> phoneBook = people.stream()
.collect(toMap(Person::getName,
Person::getAddress));
Dostaję się, java.lang.IllegalStateException: Duplicate key
gdy zostanie znaleziony zduplikowany element.
Czy można zignorować taki wyjątek podczas dodawania wartości do mapy?
W przypadku duplikatu należy po prostu kontynuować ignorowanie tego duplikatu klucza.
java
java-8
java-stream
Patan
źródło
źródło
Odpowiedzi:
Jest to możliwe przy użyciu
mergeFunction
parametruCollectors.toMap(keyMapper, valueMapper, mergeFunction)
:mergeFunction
to funkcja działająca na dwóch wartościach powiązanych z tym samym kluczem.adress1
odpowiada pierwszemu adresowi napotkanemu podczas zbierania elementów iadress2
odpowiada drugiemu napotkanemu adresowi: ta lambda po prostu mówi, aby zachować pierwszy adres i ignoruje drugi.źródło
null
. Zobacz toMap doc wskazujący na scalenie dokumentu, który stwierdza: Jeśli funkcja odwzorowania zwraca null, mapowanie jest usuwane.Jak powiedziano w JavaDocs :
Więc powinieneś użyć
toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)
zamiast tego. Wystarczy podać funkcję scalania , która określi, który z duplikatów zostanie umieszczony na mapie.Na przykład, jeśli nie obchodzi Cię który, po prostu zadzwoń
źródło
Odpowiedź @alaster bardzo mi pomaga, ale chciałbym dodać znaczącą informację, jeśli ktoś próbuje pogrupować informacje.
Jeśli masz na przykład dwa
Orders
takie same,code
ale różnequantity
produkty dla każdego z nich, a Twoim pragnieniem jest zsumowanie ilości, możesz:Wynik:
źródło
Do grupowania według obiektów
źródło
Dla każdego, kto dostanie ten problem, ale bez przesyłania duplikatów kluczy w mapie, upewnij się, że funkcja keyMapper nie zwraca wartości null .
Śledzenie tego jest bardzo denerwujące, ponieważ błąd powie „Duplikuj klucz 1”, gdy 1 jest faktycznie wartością wpisu zamiast klucza.
W moim przypadku moja funkcja keyMapper próbowała wyszukać wartości na innej mapie, ale z powodu literówki w łańcuchach zwracała wartości null.
źródło
Zetknąłem się z takim problemem podczas grupowania obiektu, zawsze rozwiązywałem je w prosty sposób: wykonaj niestandardowy filtr za pomocą pliku java.util.Set, aby usunąć zduplikowany obiekt z dowolnym wybranym atrybutem poniżej
Mam nadzieję, że pomoże to każdemu, kto ma ten sam problem!
źródło
Zakładając, że masz ludzi, to lista obiektów
Teraz potrzebujesz dwóch kroków:
1)
2)
Oto metoda usunięcia duplikatu
Dodanie pełnego przykładu tutaj
Wyniki:
źródło