Java 8映射到对象列表,其中一个字段分组为一个列表

gen*_* b. 2 java collections pojo java-stream

新手问题。我有一个原始的豆从数据库逐行

public class DataBean {
   private Integer employeeId;
   private String org;
   private String comments;
   // + Constructors, getters/setters
}
Run Code Online (Sandbox Code Playgroud)

我需要将其映射到具有多个Org的另一个Bean,这些组织按Employee ID分组到一个列表中。雇员ID的唯一组织可以是多个;“评论”字段必定是相同的。

public class CustomDataBean {
   private Integer employeeId;
   private List<String> orgs;
   private String comments;
   // + Constructors, getters/setters
}
Run Code Online (Sandbox Code Playgroud)

努力入门。想到groupingBy了以下内容,但返回了Map,而我没有建立子列表。

Map<Integer, List<String>> temp = origData.stream().collect(
    Collectors.groupingBy(OrigBean::getEmployeeId,
    /* 2nd param? */ .. ))
Run Code Online (Sandbox Code Playgroud)

我的目标是转变List<CustomDataBean>

Sam*_*ipp 5

您可以使用以下命令:

List<CustomDataBean> result = origData.stream()
        .collect(Collectors.groupingBy(DataBean::getEmployeeId))
        .entrySet().stream()
        .map(e -> new CustomDataBean(
                e.getKey(),
                e.getValue().stream().map(DataBean::getOrg).collect(Collectors.toList()),
                e.getValue().get(0).getComments()))
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这会将分组结果映射到您的CustomDataBean对象。

对于输入:

List<DataBean> origData = Arrays.asList(
        new DataBean(1, "a", "c"),
        new DataBean(1, "b", "c"),
        new DataBean(1, "c", "c"),
        new DataBean(2, "a", "d"),
        new DataBean(2, "c", "d")
);
Run Code Online (Sandbox Code Playgroud)

结果将是这样的:

CustomDataBean[employeeId=1, orgs=[a, b, c], comments='c']
CustomDataBean[employeeId=2, orgs=[a, c], comments='d']
Run Code Online (Sandbox Code Playgroud)