使用收集器将列表转换为对象映射-Java

use*_*295 16 java generics java-8 java-stream collectors

我如何使用收集器将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"
Run Code Online (Sandbox Code Playgroud)

我想对“团队”属性进行分组,并为每个团队提供一个列表,如下所示:

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

"fool":
       ["id": 23423, "name": "sam", "type": "new"]
Run Code Online (Sandbox Code Playgroud)

Pojo看起来像这样:

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

    private String id;
    private String name;
    private String type;
}
Run Code Online (Sandbox Code Playgroud)

这就是我试图这样做的方式,显然是错误的方式:

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

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

Era*_*ran 15

您当前的收集器- .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())));
Run Code Online (Sandbox Code Playgroud)

这是假设您有一些Pojo接收GenericDAO实例或相关GenericDAO属性的构造函数。


Nam*_*man 7

使用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;
}
Run Code Online (Sandbox Code Playgroud)

这样的转换convertGenericDaoToTeam可能像这样:

Team convertGenericDaoToTeam(GenericDAO genericDAO) {
    return new Team(genericDAO.getId(), genericDAO.getName(), genericDAO.getType());
}
Run Code Online (Sandbox Code Playgroud)