Czy istnieje pewna mapa, w której można umieścić wszystkie swoje wpisy w jednej mapie?Czy istnieje elegancki sposób na ograniczenie strumienia map do jednej mapy?
Ignorowanie kwestie null, wpisy nadmiernie piśmie etc, co chciałbym kod jest:
public static <K, V> Map<K, V> reduce(Map<K, V>... maps) {
return Arrays.stream(maps)
.reduce(new HashMap<K, V>(), (a, b) -> a.putAll(b));
}
ale daje to błąd kompilacji, ponieważ a.putAll(b)
jest void
. Jeśli wróci this
, to będzie działać.
Aby obejść ten problem, mam zakodowane:
public static <K, V> Map<K, V> reduce(Map<K, V>... maps) {
return Arrays.stream(maps)
.reduce(new HashMap<K, V>(), (a, b) -> {a.putAll(b); return a;});
}
który kompiluje i działa, ale jest brzydki lambda; kodowanie return a;
wydaje się zbędne.
Jedno podejście byłaby na sposób jej przydatność
public static <K, V> Map<K, V> reduce(Map<K, V> a, Map<K, V> b) {
a.putAll(b);
return a;
}
który czyści lambda
public static <K, V> Map<K, V> reduce(Map<K, V>... maps) {
return Arrays.stream(maps)
.reduce(new HashMap<K, V>(), (a, b) -> reduce(a, b));
}
lecz teraz ma, aczkolwiek nieco wielokrotnego użytku, sposób bezużyteczny użytkową.
Czy istnieje bardziej elegancki sposób wywoływania metody na akumulatorze i zwracania jej w zakresie lambda?
Niestety sposób korzystania z 'reduce' jest zasadniczo pokruszone mogą pracować dla sekwencyjnego wykonania, lecz przerwa o wykonania równoległego. Dzieje się tak dlatego, że metoda reduce() traktuje swój pierwszy parametr (tożsamość) jako wartość do ponownego użycia. Działa więc dla typów pierwotnych i niezmiennych, ale zmienne wartości (np. 'Nowa HashMap <>()') na równoległych strumieniach będą zmutowane, prawdopodobnie równolegle, przez różne wątki. To się nie skończy. Odpowiedzią jest użycie 'collect()', tak jak w odpowiedzi @ Pshemo. –