Java如何从员工列表中筛选同时经Manager1、Manager2审批通过的员工
Java实现员工多级审批筛选方案
1. 定义数据映射实体
首先按照JSON结构定义对应的Java实体类,推荐使用Lombok简化样板代码,若项目未引入Lombok可手动编写getter/setter、无参构造方法:
import lombok.Data; import java.util.List; /** * 审批记录实体 */ @Data public class Approval { // 审批人标识 private String title; // 审批通过状态 private Boolean approved; } /** * 员工实体 */ @Data public class Employee { // 员工ID private Integer id; // 员工姓名 若直接反序列化JSON下划线字段,可加@JsonProperty("employee_name")做映射 private String employeeName; // 关联审批列表 private List<Approval> approval; }
注意:如果直接从JSON字符串反序列化为Java对象,需做好下划线命名到驼峰命名的映射配置,避免字段取值为null。
2. 核心筛选实现
基于Java 8及以上版本的Stream API实现筛选,逻辑为校验每个员工的审批列表中,同时存在Manager 1、Manager 2的通过记录,自动过滤缺审批项、任意一个审批人未通过的员工:
简洁版实现(代码可读性高)
import java.util.List; import java.util.stream.Collectors; public class EmployeeFilter { public List<Employee> filterFullyApprovedEmployees(List<Employee> employeeList) { return employeeList.stream() // 先做空校验,避免空指针 .filter(emp -> emp.getApproval() != null && !emp.getApproval().isEmpty()) .filter(emp -> { // 校验Manager1审批通过 boolean m1Pass = emp.getApproval().stream() .anyMatch(ap -> "Manager 1".equals(ap.getTitle()) && Boolean.TRUE.equals(ap.getApproved())); // 校验Manager2审批通过 boolean m2Pass = emp.getApproval().stream() .anyMatch(ap -> "Manager 2".equals(ap.getTitle()) && Boolean.TRUE.equals(ap.getApproved())); return m1Pass && m2Pass; }) .collect(Collectors.toList()); } }
性能优化版实现(大列表场景推荐)
如果员工列表、单员工审批项数量较大,可以用单次遍历完成校验,提前终止循环减少不必要的遍历:
public List<Employee> filterFullyApprovedEmployeesOptimized(List<Employee> employeeList) { return employeeList.stream() .filter(emp -> emp.getApproval() != null && !emp.getApproval().isEmpty()) .filter(emp -> { boolean m1Pass = false; boolean m2Pass = false; for (Approval ap : emp.getApproval()) { if ("Manager 1".equals(ap.getTitle()) && Boolean.TRUE.equals(ap.getApproved())) { m1Pass = true; } if ("Manager 2".equals(ap.getTitle()) && Boolean.TRUE.equals(ap.getApproved())) { m2Pass = true; } // 两个审批都满足时直接跳出循环,无需遍历剩余审批项 if (m1Pass && m2Pass) { break; } } return m1Pass && m2Pass; }) .collect(Collectors.toList()); }
3. 逻辑说明
- 自动过滤审批列表为空、缺失任意一个审批人记录的员工
- 用
Boolean.TRUE.equals(ap.getApproved())判断避免拆箱空指针 - 如果后续需要新增其他审批人校验,只需要在判断逻辑中增加对应审批人的状态标记即可,扩展成本低
内容的提问来源于stack exchange,提问作者Valindom
相关产品推荐
相关产品推荐

