You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:09:03