Właśnie zacząłem patrzeć na Javę 8 i wypróbować lambdy, pomyślałem, że spróbuję przepisać bardzo prostą rzecz, którą niedawno napisałem. Muszę przekształcić Map of String to Column w inną Map of String to Column, gdzie kolumna w nowej mapie jest obronną kopią kolumny z pierwszej mapy. Kolumna ma konstruktora kopiującego. Najbliższe, jakie do tej pory uzyskałem, to:
Map<String, Column> newColumnMap= new HashMap<>();
originalColumnMap.entrySet().stream().forEach(x -> newColumnMap.put(x.getKey(), new Column(x.getValue())));
ale jestem pewien, że musi być lepszy sposób na zrobienie tego i byłbym wdzięczny za radę.
Możesz użyć tej
forEach
metody, aby zrobić, co chcesz.To, co tam robisz, to:
Które możemy uprościć do lambdy:
A ponieważ po prostu wywołujemy istniejącą metodę, możemy użyć odwołania do metody , które daje nam:
źródło
originalColumnMap.forEach((string, column) -> newColumnMap.put(string, new Column(column)));
czy mogę ją skrócić?new Column(column)
parometr, musisz to zrobić.Sposób bez ponownego wstawiania wszystkich wpisów do nowej mapy powinien być najszybszy, ponieważHashMap.clone
wewnętrznie wykonuje równieżponownehaszowanie.źródło
Map<String,Column> newColumnMap = new HashMap<>(originalColumnMap);
. Nie wiem, czy pod kołdrą jest inaczej.Map
implementacji, tzn. JeśliMap
jest aEnumMap
lub aSortedMap
, wynikMap
będzie również. W przypadkuSortedMap
ze specjalnościąComparator
może to spowodować ogromną różnicę semantyczną. No cóż, to samo dotyczyIdentityHashMap
…Zachowaj prostotę i używaj Java 8: -
źródło
Jeśli używasz w swoim projekcie guawy (minimum v11), możesz użyć Maps :: transformValues .
Uwaga: wartości tej mapy są oceniane leniwie. Jeśli transformacja jest kosztowna, możesz skopiować wynik do nowej mapy, jak sugerowano w dokumentacji Guava.
źródło
To avoid lazy evaluation when the returned map doesn't need to be a view, copy the returned map into a new map of your choosing.
Oto inny sposób, który daje dostęp do klucza i wartości w tym samym czasie, na wypadek, gdybyś musiał dokonać jakiejś transformacji.
źródło
Jeśli nie masz nic przeciwko korzystaniu z bibliotek innych firm, moja biblioteka cyclops-react ma rozszerzenia dla wszystkich typów kolekcji JDK , w tym Map . Możesz bezpośrednio użyć metody map lub bimap, aby przekształcić swoją mapę. MapX można zbudować z istniejącej mapy, np.
Jeśli chcesz również zmienić klucz, możesz napisać
bimap może służyć do jednoczesnego przekształcania kluczy i wartości.
W miarę jak MapX rozszerza Map, wygenerowana mapa może być również zdefiniowana jako
źródło