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

如何用Streams API和Optional消除findEmployee方法的NullPointerException

用Streams API和Optional重构查找员工方法以避免NullPointerException

问题背景

现有Employee和Company两个类,Company通过Employee[] employees数组存储员工实例,原有的findEmployee方法在数组存在null元素时会抛出NullPointerException,需要使用Streams API和Optional重写该方法以消除异常。

原方法核心问题:遍历数组时未处理null元素,直接调用employees[i].getId()会触发空指针异常。

重构方案

直接重写Company类中的findEmployee方法,利用流式操作过滤null元素,并通过Optional封装结果:

import java.util.Arrays;
import java.util.Objects;
import java.util.Optional;

public class Employee {
    protected final int id;
    protected String name;

    public Employee(int id, String name) {
        this.id = id;
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
}

public class Company {
    private Employee[] employees;
    private int size;
    private static final int defaultCapacity = 5;
    
    public Company() {
        this(defaultCapacity);
    }
    
    public Company(int capacity) {
        if (capacity <= 0)
             throw new RuntimeException("capacity is required");
        employees = new Employee[capacity];
    }

    // 重构后的查找方法
    public Optional<Employee> findEmployee(int id) {
        return Arrays.stream(employees)
                .limit(size) // 仅遍历已添加的有效元素,和原逻辑的i < size一致
                .filter(Objects::nonNull) // 过滤null元素,避免调用getId()时触发NPE
                .filter(employee -> employee.getId() == id)
                .findFirst(); // 返回第一个匹配元素,包装为Optional
    }
}

关键逻辑说明

  1. 数组转流:通过Arrays.stream(employees)将数组转换为Stream,便于进行链式流式操作。
  2. 限制遍历范围:limit(size)确保只处理实际添加的员工元素,忽略数组中未使用的空位,和原代码循环边界逻辑对齐。
  3. 过滤null元素:filter(Objects::nonNull)提前剔除数组中的null元素,后续调用getId()时就不会触发空指针异常。
  4. Optional封装结果:findFirst()返回Optional<Employee>,找到匹配员工时返回包含该实例的Optional,未找到则返回Optional.empty(),彻底避免返回null。

调用示例

使用重构后的方法时,通过Optional的API安全处理结果:

public class Main {
    public static void main(String[] args) {
        Company company = new Company();
        // 添加员工,故意插入null模拟场景
        company.employees[0] = new Employee(1, "张三");
        company.employees[1] = null;
        company.employees[2] = new Employee(2, "李四");
        company.size = 3;

        // 查找存在的员工
        Optional<Employee> empOpt = company.findEmployee(2);
        empOpt.ifPresent(emp -> System.out.println("找到员工:" + emp.getName()));
        
        // 查找不存在的员工,返回空Optional
        Optional<Employee> notFoundEmp = company.findEmployee(99);
        // 未找到时返回默认值
        Employee defaultEmp = notFoundEmp.orElse(new Employee(-1, "默认员工"));
    }
}

内容的提问来源于stack exchange,提问作者Evgeniy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:35:36