Преобразование Map с помощью Stream API

Имеется структура типа Map<String, List<MyClass>>. Как с помощью Stream API преобразовать ее к типу Map<String, List<MyClass.getField()>>, где MyClass.getField() - некоторое поле класса MyClass?


Ответы (1 шт):

Автор решения: Сабир Исламов

Вот более прямолинейный и грубый вариант при помощи forEach:

public class MapToMap {
    public static void main(String[] args) {
        Map<String, List<String>> mySrc = new HashMap<>();

        List<String> list1 = new ArrayList<>();
        list1.addAll(Arrays.asList("asdf", "qwerty", "zxcvb"));
        mySrc.put("list1", list1);

        List<String> list2 = new ArrayList<>();
        list2.addAll(Arrays.asList("asdf1234", "qwer12345", "zxcv12456"));
        mySrc.put("list2", list2);

        // Создаем переменную назначения
        Map<String, List<Integer>> myDst = new HashMap<>();

        // И здесь полностью проводим разбор и сохранение
        mySrc.entrySet().stream().forEach(elem -> {
            var myKeySrc = elem.getKey();
            var myValSrc = elem.getValue();
            List<Integer> myValDst = new ArrayList();
            myValSrc.stream().forEach(i -> myValDst.add(i.length()));
            myDst.put(myKeySrc, myValDst);
        });

        for (Map.Entry<String, List<Integer>> elem : myDst.entrySet()) {
            System.out.println(elem.getKey());
            for (Integer i : elem.getValue()) {
                System.out.printf("\t%d\n", i);
            }
        }
    }
}

Вывод:

list1
    4
    6
    5
list2
    8
    9
    9
→ Ссылка