java - java 8中的Group By具有多级分组

标签 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 managerName;
 private String employeeName;
}

数据库已非规范化。

在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;
 ...
}

通过分组,我想接收列表。现在我弄清楚了如何对导演进行分组:

Map<WorkersResponse, List<Workers >> collect = all.stream()
            .collect(Collectors.groupingBy(v -> {
                WorkersResponse workersResponse= new WorkersResponse();
                workersResponse.setDirector(v.getDirectorName());
                return workersResponse;
            }));

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

最佳答案

根据分组要求,您应该尝试将嵌套分组与Collectors.mapping一起使用,例如:

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

此后,当您迭代收集的 Map 的条目时,映射到所需类型的对象是唯一剩下的约束 -

List<WorkersResponse> workersResponses = groupingRequirement.entrySet().stream()
        .map(e -> new WorkersResponse(e.getKey(), // director name
                e.getValue().entrySet()
                        .stream()
                        .map(ie -> new Manager(ie.getKey(), // manager name
                                ie.getValue()
                                        .stream()
                                        .map(Employee::new)
                                        .collect(Collectors.toList())))
                        .collect(Collectors.toList())))
        .collect(Collectors.toList());

关于java - java 8中的Group By具有多级分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62086030/

相关文章:

javascript - jquery数组按多个元素分组并查找总数

java - 使用 java Files.walk 仅从根文件夹获取文件名并跳过其子目录时出现问题

java - 如何表示一个空的 InputStream

java-8 - JAVA 8 - 从 3 个 POJO 类检索数据时出现错误的流功能

ruby - 将连续整数序列分组

java - 检查在移动屏幕上滑动是否加载新元素

java - Java的浮点实现是否还有Kahan发现的问题?

java - 调用时更改从 Netbeans 运行的 Tomcat 的 Java 版本

java - 如何判断 javax.servlet 是否成功发送响应

.net - 为什么GroupBy多个字段无法正确分组>