Используйте Collectors.groupingBy
вместе с Collectors.mapping
:
Map<String, List<Object>> result = listOfMaps.stream()
.collect(Collectors.groupingBy(map -> map.get("id").toString(),
Collectors.mapping(map -> map.get("name"),
Collectors.toList())));
Collectors.groupingBy
создает необходимую карту, а Collectors.mapping
адаптирует коллектор в другой, применяя функцию отображения к каждому элементу потока. (В этом случае он собирается в список, сначала преобразовывая каждую карту потока в значение, сопоставленное с ключом "name"
).
При необходимости приведенный выше код может быть изменен, чтобы пропустить карты, в которых нет записи с ключом "id"
:
Map<String, List<Object>> result = listOfMaps.stream()
.filter(map -> map.get("id") != null))
.collect(Collectors.groupingBy(map -> map.get("id").toString(),
Collectors.mapping(map -> map.get("name"),
Collectors.toList())));