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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:54:23