如何用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 } }
关键逻辑说明
- 数组转流:通过
Arrays.stream(employees)将数组转换为Stream,便于进行链式流式操作。 - 限制遍历范围:
limit(size)确保只处理实际添加的员工元素,忽略数组中未使用的空位,和原代码循环边界逻辑对齐。 - 过滤null元素:
filter(Objects::nonNull)提前剔除数组中的null元素,后续调用getId()时就不会触发空指针异常。 - 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
相关产品推荐
相关产品推荐

