我想使用employeeId构造一个Employee对象,如果没有找到employeeId,则打印一条消息。根据我的理解,我得出以下结论:
private Optional<Employee> createEmployee(SearchParams params) {
Optional<String> employeeId = searchEmpId(params);
Optional<Employee> employeeOptional = employeeId.map(epmId -> new Employee());
employeeOptional.ifPresent(employee -> {
employee.setName(getEmpName(employeeId));
employee.setSalary(getEmpSalary(employeeId));
});
employeeOptional.orElseGet(() -> {
LOG.warn("No emp records found for params {}.", params);
return null;
});
return employeeOptional;
}
有没有办法简化/优化上面的代码?我相信应该有一个简单的方法来做到这一点。非常感谢任何帮助。
最佳答案
基本上就是这样
Optional<Employee> createEmployee(SearchParams params) {
return searchEmpId(params).map(id -> {
Employee e = new Employee();
e.setName(getEmpName(id));
e.setSalary(getEmpSalary(id));
return e;
})
空员工的情况是快乐流程的一个异常(exception),应该以这种方式实现和处理。这样做的目的是避免显式调用
if(!empOptional.isPresent() {...}
要么写入日志语句,要么返回空选项,因为无论如何,您都必须稍后在控制流中处理空选项。
例如,更好地定义特殊流程
try {
Employee e = createEmployee(params).orElseThrow(() -> new EmployeeNotFoundException());
e.practice("java");
} catch(EmployeeNotFoundExceptione e){
LOG.info("not found, 404, whatever", e);
}
当然,您也可以在上层处理该异常,只要适合您的情况即可。
关于java - 在 Java 8 中使用可选,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40745753/