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

298
15 мая 2022, 06:10

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

Answer 1

Получаем лист строк из листа объектов

Преобразовываем Map<String, List<MyClass>> в Map<String, List<String>>:

class MyClass {
    String field;
    public MyClass(String field) {
        this.field = field;
    }
    public String getField() {
        return field;
    }
}
public static void main(String[] args) {
    Map<String, List<MyClass>> map = new HashMap<>();
    map.put("one", Arrays.asList(new MyClass("one1"), new MyClass("one2")));
    map.put("two", Arrays.asList(new MyClass("two1"), new MyClass("two2")));
    Map<String, List<String>> map2 = map.entrySet().stream()
        // собираем из исходной
        // карты новую карту
        .collect(Collectors.toMap(
            // ключ такой же
            k -> k.getKey(),
            // значение - из листа объектов
            // получаем лист строк
            v -> v.getValue().stream()
                // получаем значение
                // поля объекта
                .map(MyClass::getField)
                // собираем обратно в лист
                .collect(Collectors.toList())));
    System.out.println(map2); // {one=[one1, one2], two=[two1, two2]}
}

Если у нас List<Object>, то не обязательно собирать новую карту, можно преобразовать существующую, т. е. заменить значения в листе:

public static void main(String[] args) {
    Map<String, List<Object>> map = new HashMap<>();
    map.put("one", Arrays.asList(new MyClass("one1"), new MyClass("one2")));
    map.put("two", Arrays.asList(new MyClass("two1"), new MyClass("two2")));
    map.forEach((key, list) ->
        IntStream.range(0, list.size()).forEach(i ->
            // получаем значение поля объекта
            // и заменяем им сам объект
            list.set(i, ((MyClass) list.get(i)).getField())));
    System.out.println(map); // {one=[one1, one2], two=[two1, two2]}
}
Answer 2

Вот более прямолинейный и грубый вариант при помощи 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
READ ALSO
Как впихнуть в SQL запрос переменную?

Как впихнуть в SQL запрос переменную?

Есть postgres DB, пользователь вводит почту и пароль, по этим данным нужно вывести ему из другой таблицы его счетаКак в запросе в Java закинуть эту...

279
Меняется цвет изображения категории WooCommerce

Меняется цвет изображения категории WooCommerce

При загрузке изображения категории товаров происходит изменение цвета фотоОт черного к коричневому

294
Белые полосы на сайте написанном на PHP. Как убрать?

Белые полосы на сайте написанном на PHP. Как убрать?

Кода начинал верстать шаблон для сайта, полос не было, но спустя некоторое время начали появлятся полосы с id: #textЧто они означают? И как их убрать?...

237
Добавление разного текста на изображения

Добавление разного текста на изображения

Как добавить текст на эти изображения?

267