2015-03-24 18 views
9

Tworzę HashMap korzystając java8 stream API następująco:Jak utworzyć HashMap ze strumieniami przesłaniającymi duplikaty?

Map<Integer, String> map = dao.findAll().stream() 
    .collect(Collectors.toMap(Entity::getType, Entity::getValue)); 

Teraz, jeśli element jest dodawany do kolekcji, gdzie już istnieje klucz, po prostu chcę, aby zachować istniejący element na liście i pomiń

dodatkowy element. Jak mogę to osiągnąć? Prawdopodobnie muszę użyć BinaryOperation<U> z toMap(), ale czy ktoś może dostarczyć

przykład mojego konkretnego przypadku?

+1

Czy obejrzałeś dokumentację? Ponieważ stanowią przykład: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util.function. Funkcja-java.util.function.BinaryOperator- –

Odpowiedz

9

Tak, potrzebujesz tego BinaryOperation<U> i używasz go jako trzeciego argumentu dla Collectors.toMap().

W przypadku konfliktu (pojawienie się już istniejącego klucza) można wybrać między wartością oldValue (istniejącą) i newValue. W przykładowym kodzie zawsze przyjmujemy wartość oldValue. Ale możesz zrobić cokolwiek innego za pomocą tych dwóch wartości (weź większy, połącz oba itd.).

Poniższy przykład pokazuje jedną z możliwych rozwiązanie, w którym istniejąca wartość pozostaje zawsze w mapie:

Map<Integer, String> map = dao.findAll().stream() 
    .collect(Collectors.toMap(Entity::getType, Entity::getValue, (oldValue, newValue) -> oldValue)); 

Patrz documentation na innym przykładzie.

Powiązane problemy