Java 8 Отображение списка карт, группирующихся по ключу - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть следующее: List<Map<String, Object>>.Я хочу получить Map<String, List<Object> используя потоки.Ключ этой карты будет ключом, который повторяется в списке.По сути, это один ко многим, это будет пример данных:

[
    { id: "a", name: "AAA"}
    { id: "a", name: "BBB"}
    { id: "b", name: "XXX"}
    { id: "b", name: "YYY"}
]

И я хотел бы получить:

{
    a: ["AAA", "BBB"],
    b: ["XXX", "YYY"]
}

Итак, эта новая картагруппировка по идентификатору из предыдущего списка.

1 Ответ

2 голосов
/ 01 апреля 2019

Используйте 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())));
...