java - 多个字段上的对象列表分组 Java 8

标签 java collections java-8 group-by

我将有一个 Employee 列表,其中包含 3 个属性 - DepartmentId、employeeId、employeeGroup。

我想对部门 ID 和员工 ID 执行分组。这个想法是发送所属部门的员工的组名。以下是 3 种可能的情况:

案例#1:同一部门、不同员工、不同组。

["Dept001", 100, "Admin"]
["Dept001", 101, "Contrator"]

案例#2:同一部门、同一员工、不同组

["Dept001", 100, "Admin"]
["Dept001", 100, "Contrator"]

案例#3:不同的部门、不同的员工、同一组。

["Dept001", 100, "Admin"]
["Dept002", 101, "Admin"]

我尝试过以下方法:

Map<String, Set<Employee>> map = new TreeMap<>();

map = myList.stream().collect(Collectors.groupingBy(Employee::getDepartmentId, 
Collectors.toSet()));

最佳答案

按多个字段分组将需要多次调用 Collectors#groupingBy 。幸运的是,重载的第二个参数Collectors#groupingBy方法是另一种Collector ,因此只需调用两次即可。

Map<String, Map<Integer, Set<Employee>>> map = myList.stream()
    .collect(Collectors.groupingBy(Employee::getDepartmentId, 
        Collectors.groupingBy(Employee::getEmployeeId, Collectors.toSet())));

请注意,Map 的值是另一个Map;第一个以员工的部门 ID 为 key ,第二个以员工的员工 ID 为 key 。

关于java - 多个字段上的对象列表分组 Java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61108086/

相关文章:

java - Java 12 无法访问 org.openqa.selenium.chrome.ChromeDriver 类型

java - 从 NavigableSet 中获取特定索引处的元素

java - 如何在我自己的集合上使用 For-Each 循环?

java - 尝试从 java 运行 gsutils 永远不会返回

具有过滤条件工作流程的 Java 8 流

java - 如何检查当前Java版本是否高于1.6

用于计算四分位距的Java api

java - 如何传递带有类型参数的空列表?

java 8 - Arrays.stream().filter 过滤掉空字符串并转换为数组

java - java中的运行时类