Имеется структура типа Map<String, List<MyClass>>
.
Как с помощью Stream API преобразовать ее к типу Map<String, List<MyClass.getField()>>
, где MyClass.getField()
- некоторое поле класса MyClass
?
Преобразовываем 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]}
}
Вот более прямолинейный и грубый вариант при помощи 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть postgres DB, пользователь вводит почту и пароль, по этим данным нужно вывести ему из другой таблицы его счетаКак в запросе в Java закинуть эту...
При загрузке изображения категории товаров происходит изменение цвета фотоОт черного к коричневому
Кода начинал верстать шаблон для сайта, полос не было, но спустя некоторое время начали появлятся полосы с id: #textЧто они означают? И как их убрать?...