【问题标题】:Use Collectors to convert List to Map of Objects - Java使用收集器将列表转换为对象映射 - Java
【发布时间】:2019-10-07 16:25:50
【问题描述】:

如何使用收集器将 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"

我想 groupBy '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))
    }

【问题讨论】:

    标签: java generics java-8 java-stream collectors


    【解决方案1】:

    您的电流收集器 - .collect(Collectors.groupingBy(GenericDAO::getTeam)) - 正在生成 Map&lt;String,List&lt;? extends GenericDAO&gt;&gt;

    为了生成Map&lt;String, List&lt;Pojo&gt;&gt;,您必须通过将Collectors.mapping() 收集器链接到Collectors.groupingBy() 收集器来将GenericDAO 实例转换为Pojo 实例:

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

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

    【讨论】:

      【解决方案2】:

      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());
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-16
        • 2019-07-09
        • 1970-01-01
        • 2021-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多