如何用Java Stream API从含部门列表的员工列表生成Map<Department,List<Employee>>
实现方案
核心代码
import java.util.AbstractMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; // 原有员工、部门初始化代码省略 List<Employee> employees = List.of(e1, e2, e3, e4); Map<Department, List<Employee>> result = employees.stream() // 拍平为【部门-员工】的映射条目 .flatMap(emp -> emp.getDepartments().stream() // JDK9及以上直接用Map.entry,JDK8替换为下一行注释的代码即可 .map(dept -> Map.entry(dept, emp)) //.map(dept -> new AbstractMap.SimpleEntry<>(dept, emp)) ) // 按部门分组,收集对应员工列表 .collect(Collectors.groupingBy( Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()) )); return result;
逻辑说明
- 先通过
flatMap把单个员工关联多部门的一对多关系,拆成多个「部门-所属员工」的一对一映射条目,比如属于a、b两个部门的员工e1会被拆为<a,e1>、<b,e1>两个独立条目 - 再通过
Collectors.groupingBy把部门作为键分组,自动将同一部门对应的所有员工收集为列表,直接得到目标Map结构
效率对比
原有嵌套循环的时间复杂度为 O(部门数量×员工数量),Stream实现仅需遍历一次所有员工的关联部门,时间复杂度为 O(所有员工关联的部门总数),数据量越大性能优势越明显。
内容的提问来源于stack exchange,提问作者Varun Yadav
相关产品推荐
相关产品推荐

