Biorąc pod uwagę Map<String, Person>
gdzie człowiek ma metodę String getName()
(ETC) na to, w jaki sposób można włączyć Map<String, Person>
do Map<String, String>
gdzie String
uzyskuje się z wywołaniem Person::getName()
?Używając strumieni, jak mogę odwzorować wartości w HashMap?
Pre-Java 8 użyję
Map<String, String> byNameMap = new HashMap<>();
for (Map.Entry<String, Person> person : people.entrySet()) {
byNameMap.put(person.getKey(), person.getValue().getName());
}
ale chciałbym to zrobić za pomocą strumieni i lambdy.
Nie widzę, jak to zrobić w stylu funkcjonalnym: Mapa/HashMap nie implementuje Stream
.
people.entrySet()
zwraca wartość Set<Entry<String, Person>>
, którą mogę przesłać strumieniowo, ale jak dodać nową Entry<String, String>
do mapy docelowej?
Akceptuję to, ponieważ jest tak schludny i nie jest męczący dla pętli. Rozwiązanie Guave jest szczególnie zadbane. Dzięki –
@DavidKerr Zauważ, że pierwszy kod nie może być ustawiony równolegle, ponieważ HashMap nie jest bezpieczny dla wątków, w przeciwieństwie do użycia kolektora/toMap, który podzieli zadanie, jeśli strumień jest równoległy. Wersja Guava nie może być również równoległa. Ale jeśli to nie jest problem, to z całą pewnością korzystaj z tej wersji. – assylias
Pierwsze rozwiązanie nie działa. Inna odpowiedź, za pomocą kolektora toMap, jest. – Eelco