java - 在 Java 8 中使用可选

标签 java option-type

我想使用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/

相关文章:

java - 无键时从 HashMap<String, String> 返回

java - 如何在 Android 代码中动态地为字符串添加粗体和下划线?

java - 方法在 netbeans 分析器中花费 0ms

java - 从 Java 访问 scala.None

ios - 通过任意操作快速进行可选链接?

java - 在java中将JSON从一种格式转换为另一种JSON格式

java - 如何向 java 添加库?我不使用任何IDEA,我只使用命令提示符

Java8 列表返回元素或 null

Swift:类中可选字典的变量:在输出中显示括号

swift - 无法将 [Address] 类型的值分配给 [Address] 类型的值?