如何使用Java Stream处理Employee列表获取所有员工及下属的姓名
实现方案
你现有代码只处理了顶层Employee节点,没有递归遍历每个员工的reportingEmp下属列表,所以需要先把所有层级的员工节点扁平化,再提取姓名。
步骤1:给Employee类补充Getter方法
首先要确保能访问Employee的私有属性,给类添加对应的Getter:
class Employee { private String name; private String id; private List<Employee> reportingEmp; public String getName() { return name; } public List<Employee> getReportingEmp() { return reportingEmp; } }
步骤2:编写递归扁平化的辅助方法
写一个方法将单个Employee及其所有下属展开为Stream:
// 放在你调用Stream的同一个类里即可 private Stream<Employee> flattenEmployee(Employee emp) { // 无下属时直接返回当前员工 if (emp.getReportingEmp() == null || emp.getReportingEmp().isEmpty()) { return Stream.of(emp); } // 拼接当前员工 + 所有下属递归展开的结果 return Stream.concat( Stream.of(emp), emp.getReportingEmp().stream().flatMap(this::flattenEmployee) ); }
步骤3:修改Stream代码
用flatMap调用上面的辅助方法展开所有员工,再提取姓名:
import java.util.stream.Collectors; // 你的原有emp是顶层员工List List<String> names = emp.stream() .flatMap(this::flattenEmployee) .map(Employee::getName) .collect(Collectors.toList());
效果验证
最终输出的names列表顺序完全符合你的预期:
John Mark Mike Lindsey Steve Andrew
哪怕你的员工层级更深(比如下属还有自己的下属),这个方案也能自动递归拉取所有员工的姓名,不需要修改逻辑。
内容的提问来源于stack exchange,提问作者Jeeppp
相关产品推荐
相关产品推荐

