Используйте коллекторы для преобразования списка в карту объектов - Java - PullRequest
15 голосов
/ 21 мая 2019

Как использовать коллекторы для преобразования списка DAO в Map<String, List<Pojo>>

daoList выглядит примерно так:

[0] : id = "34234", team = "gools", name = "bob", type = "old"
[1] : id = "23423", team = "fool" , name = "sam", type = "new"
[2] : id = "34342", team = "gools" , name = "dan", type = "new"

Я хочу сгруппироватьBy 'team'атрибут и есть список для каждой команды, как показано ниже:

"gools":
       ["id": 34234, "name": "bob", "type": "old"],
       ["id": 34342, "name": "dan", "type": "new"]

"fool":
       ["id": 23423, "name": "sam", "type": "new"]

Pojo выглядит так:

@Data
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PUBLIC)
public class Pojo{

    private String id;
    private String name;
    private String type;
}

Вот как я пытаюсь это сделать, очевидно, неправильно:

public Team groupedByTeams(List<? extends GenericDAO> daoList)
    {

        Map<String, List<Pojo>> teamMap= daoList.stream()
            .collect(Collectors.groupingBy(GenericDAO::getTeam))
    }

Ответы [ 2 ]

14 голосов
/ 21 мая 2019

Ваш текущий сборщик - .collect(Collectors.groupingBy(GenericDAO::getTeam)) - генерирует Map<String,List<? extends GenericDAO>>.

Чтобы сгенерировать Map<String, List<Pojo>>, вы должны преобразовать свои GenericDAO экземпляры в Pojo экземпляры путем создания цепочкиCollectors.mapping() сборщик для Collectors.groupingBy() сборщика:

Map<String, List<Pojo>> teamMap = 
    daoList.stream()
           .collect(Collectors.groupingBy(GenericDAO::getTeam,
                                          Collectors.mapping (dao -> new Pojo(...),
                                                              Collectors.toList())));

Предполагается, что у вас есть какой-то конструктор Pojo, который получает экземпляр GenericDAO или соответствующие свойства GenericDAO.

6 голосов
/ 21 мая 2019

Используйте mapping как:

public Map<String, List<Team>> groupedByTeams(List<? extends GenericDAO> daoList) {
    Map<String, List<Team>> teamMap = daoList.stream()
            .collect(Collectors.groupingBy(GenericDAO::getTeam,
                    Collectors.mapping(this::convertGenericDaoToTeam, Collectors.toList())));
    return teamMap;
}

, где конверсия, такая как convertGenericDaoToTeam, может быть такой:

Team convertGenericDaoToTeam(GenericDAO genericDAO) {
    return new Team(genericDAO.getId(), genericDAO.getName(), genericDAO.getType());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...