Funkcyjne mapowanie wartości z jednej mapy do drugiej

0

Cześć,
Czy da się w Javie zrobić funkcyjnie mapowanie wartości mapy na inne wartości?
Dla przykładu, elementy listy można przemapować na elementy innej listy

List<A1> lista1 = new LinkedList<>();
// wypelniamy lista1
List<A2> lista2 = new LinkedList<>();

lista2 = lista1.stream().map(a1 -> a2).collect(Collectors.toList());

Czy można w podobny sposób zrobić to na wartościach mapy, tak by parze wejściowej <k,v1> odpowiadała para wyjściowa <k,v2>, gdzie zachodzi mapowanie v1->v2. Albo jeszcze lepiej: <k, Optional<v1>> -> <k, Optional<v2>>

W tej chwili jedyne rozwiązanie jakie mi przychodzi do głowy to coś w tym stylu:

Map<K, V1> keysAndValues1;

Map<K, V2> keysAndValues2 = new HashMap<>();

keysAndValues1.forEach(new BiConsumer<K, V1>() {
           @Override
            public void accept(K key, V1 v1) {
                    V2 v2 = mapV1toV2(v1);
                    keysAndValues2.put(key, v2);
            }
        });

Ale zainspirowany wpisem @jarekr000000 o Monadach zachciało mi się szukać bardziej eleganckich rozwiązań.

1

na java.util.HashMap to
entrySet().stream().map(....).collect(Collectors.toMap..)
Natomiast w VAVR.io
masz ładne HashMap
i metody map(),bimap(), mapValues(), itd.

vavr

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.