Java8中具有多级分组的GROUPBY

Java8中具有多级分组的GROUPBY,java,java-stream,grouping,Java,Java Stream,Grouping,我有这样的结构 | Director1 | Manager1 | Employee1 | | Director1 | Manager1 | Employee2 | | Director1 | Manager2 | Employee3 | | Director2 | Manager3 | Employee4 | 我像这样从Db向Pojo获取这些数据 @Data public class Workers { private String directorName; private String

我有这样的结构

| Director1 | Manager1 | Employee1 |
| Director1 | Manager1 | Employee2 |
| Director1 | Manager2 | Employee3 |
| Director2 | Manager3 | Employee4 |
我像这样从Db向Pojo获取这些数据

@Data
public class Workers {
 private String directorName;
 private String managerName;
 private String employeeName;
}
DB是非规范化的

在java代码中,我需要将此响应分组为不返回冗余数据。我的回复数据看起来像

@Data
public class WorkersResponse{
 private String directorName;
 ...
 private List<Manager> managers;
}

@Data
public class Manager{
 private String manager;
  ...
 private List<Employee> employee;
}

@Data
public class Employee{
 private String employee;
 ...
}
@数据
公共类工作人员响应{
私有字符串directorName;
...
私人名单管理人;
}
@资料
公共班级经理{
私有字符串管理器;
...
私人名单雇员;
}
@资料
公营雇员{
私人雇员;
...
}
通过分组,我想接收列表。现在我知道了如何对董事进行分组:

Map<WorkersResponse, List<Workers >> collect = all.stream()
            .collect(Collectors.groupingBy(v -> {
                WorkersResponse workersResponse= new WorkersResponse();
                workersResponse.setDirector(v.getDirectorName());
                return workersResponse;
            }));
Map collect=all.stream()
.collect(收集器)。分组方式(v->{
WorkersResponse WorkersResponse=新的WorkersResponse();
workersResponse.setDirector(v.getDirectorName());
回复工作人员的回复;
}));

但是我应该如何用经理和员工填充列表呢?

根据分组要求,您应该尝试使用嵌套分组和
收集器。映射
例如:

Map<String, Map<String, List<String>>> groupingRequirement = workersList.stream()
        .collect(Collectors.groupingBy(Workers::getDirectorName,
                Collectors.groupingBy(Workers::getManagerName,
                        Collectors.mapping(Workers::getEmployeeName,
                                Collectors.toList()))));

@Naman已经给出了更好的答案,只是想补充一点, 您也可以使用
collecting然后

List<WorkersResponse> requirement = workersList.stream()
        .collect(Collectors.collectingAndThen(Collectors.groupingBy(Workers::getDirectorName,
                Collectors.collectingAndThen(Collectors.groupingBy(Workers::getManagerName,
                        Collectors.mapping(w -> new Employee(w.getEmployeeName()),Collectors.toList())),
                    e -> e.entrySet().stream().map(ie -> new Manager(ie.getKey(), ie.getValue()))
                          .collect(Collectors.toList()))),
            e -> e.entrySet().stream().map(ie -> new WorkersResponse(ie.getKey(), ie.getValue()))
                          .collect(Collectors.toList())));
List requirement=workersList.stream()
.collect(收集器.collectingAndThen(收集器.groupingBy)(工作者::getDirectorName,
收集器.CollectionAndThen(收集器.groupingBy(Workers::getManagerName,
Collectors.mapping(w->newemployee(w.getEmployeeName()),Collectors.toList()),
e->e.entrySet().stream().map(ie->new Manager(ie.getKey(),ie.getValue())
.collect(收集器.toList()),
e->e.entrySet().stream().map(ie->new WorkersResponse(ie.getKey(),ie.getValue())
.collect(Collectors.toList());

您只需要姓名?您可以在映射时创建员工also@Eklavya是的,现在我看到另一个答案与之相适应,进一步编辑这个答案没有多大意义。无论如何,嵌套分组的方法对解决方案至关重要。@Naman也许您现在可以更新它。我已经删除了另一个。@Naman我添加了一个答案,收集并映射到一起,就像您的解决方案一样,希望对您没有问题。@Naman非常感谢。在你发布答案之前,我想了第一部分,但第二部分对我帮助很大。是的,在第二个答案中,我把它锁起来了。谢谢
List<WorkersResponse> requirement = workersList.stream()
        .collect(Collectors.collectingAndThen(Collectors.groupingBy(Workers::getDirectorName,
                Collectors.collectingAndThen(Collectors.groupingBy(Workers::getManagerName,
                        Collectors.mapping(w -> new Employee(w.getEmployeeName()),Collectors.toList())),
                    e -> e.entrySet().stream().map(ie -> new Manager(ie.getKey(), ie.getValue()))
                          .collect(Collectors.toList()))),
            e -> e.entrySet().stream().map(ie -> new WorkersResponse(ie.getKey(), ie.getValue()))
                          .collect(Collectors.toList())));