Преобразование 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