Java中如何链式调用多个orElse?报错问题及解决方法咨询
问题分析与解决方案
报错原因
你遇到的cannot resolve method 'orElse'是因为:
employeeService.find(employeeId)返回的是Optional<Employee>,调用orElse(employeeService.findEmployeeBySocialId(employeeId))后,会直接返回Employee对象(要么是find方法找到的,要么是findEmployeeBySocialId返回的)。- 而
Employee类并没有orElse方法,所以后续链式调用这个方法会编译报错。
解决方案
下面给出几种可行的实现方式,你可以根据代码风格偏好选择:
方案1:利用Java 9+的Optional.or()方法(推荐)
or()方法接受一个返回Optional的供应商,能保持链式调用的简洁性,同时把返回Employee的方法包装成Optional:
private Employee getEmployee(String employeeId) { if (employeeId == null || employeeId.isEmpty()) { return null; } return employeeService.find(employeeId) // 第一次备选:用Optional包装findEmployeeBySocialId的结果 .or(() -> Optional.ofNullable(employeeService.findEmployeeBySocialId(employeeId))) // 第二次备选:在ID末尾加Y后再查找 .or(() -> Optional.ofNullable(employeeService.findEmployeeBySocialId(employeeId + "Y"))) // 所有查找都无结果时返回null .orElse(null); }
方案2:嵌套使用orElseGet
如果你的项目还在用Java 8,可以用orElseGet结合嵌套的Optional包装:
private Employee getEmployee(String employeeId) { if (employeeId == null || employeeId.isEmpty()) { return null; } return employeeService.find(employeeId) .orElseGet(() -> // 先尝试第一个SocialId查找,无结果则尝试加Y后的查找 Optional.ofNullable(employeeService.findEmployeeBySocialId(employeeId)) .orElseGet(() -> employeeService.findEmployeeBySocialId(employeeId + "Y")) ); }
方案3:分步判断(可读性最高)
如果追求逻辑的直观性,直接分步处理每一次查找:
private Employee getEmployee(String employeeId) { if (employeeId == null || employeeId.isEmpty()) { return null; } // 第一次通过ID查找 Optional<Employee> employeeOpt = employeeService.find(employeeId); if (employeeOpt.isPresent()) { return employeeOpt.get(); } // 第二次通过原SocialId查找 Employee employee = employeeService.findEmployeeBySocialId(employeeId); if (employee != null) { return employee; } // 第三次通过加Y后的SocialId查找 return employeeService.findEmployeeBySocialId(employeeId + "Y"); }
内容的提问来源于stack exchange,提问作者craftdeer
相关产品推荐
相关产品推荐

