空的“可选”类型的返回值应该是什么?

时间:2018-08-09 04:46:06

标签: java return-value optional

我有一连串的方法,其中一个方法的返回类型为Optional如下

public Optional<Employee> find(long id) {

   for (Employee employee : this.employees) {
      if (employee.getId() == id) {
         return Optional.of(employee);
      }
   }
   return Optional.empty();
}

public Employee findlById(long id) {

   return find(id);
} 

第二种方法findById会因为自身的返回类型和find方法的返回类型而发生编译错误。

现在,如果我检查该值并找到它,则可以返回该对象。但是如果Optional对象为空,我应该返回什么?

public Employee findlById(long id) {

   Optional<Employee> employee = find(id);
   if (employee.isPresent()) {
      return employee.get();
   }
   return // what??;
}

从我已阅读的Internet资源中,永远不要为null对象返回Optional。因此,如果不是null而不是what,我会感到困惑吗?

5 个答案:

答案 0 :(得分:2)

如果您返回的是Optional类型,则可以像这样使用Optional.empty()

return Optional<Employee>.empty();

但是由于您的退货类型为Employee,因此您的选择是将退货类型更改为Optional<Employee>并使用上面的内容,return null; 抛出某种{ {1}}。

答案 1 :(得分:1)

取决于方法的约定。假设该ID来自用户输入-您很有可能没有该ID的员工。预计您将在程序中处理该错误。由于将异常用于控制流通常是一种不好的做法,请返回Optional<Employee>null

如果您希望该ID存在一个Employee(可能是该ID是从程序的另一部分收到的列表中传递的),则最好抛出Exception。 (在这种情况下,我建议为该函数使用其他名称-类似于getEmployeeDetails

最后,您的处理方式完全取决于您的要求-我怀疑是否有单个解决方案。

答案 2 :(得分:0)

它特定于您的用例。问题是,如果找不到给定ID的员工,应该返回什么。有以下选择-

  1. 如果findById()的调用者可以返回为空,则返回空
  2. 根据您的用例对某些消息进行自定义抛出异常

答案 3 :(得分:0)

我没有完整的信息来建议您所需的具体答案,但我可以建议4种可能合适的解决方案:

  1. findById方法应自行返回可选的it。这使您可以方便地确定每种情况(如果找不到该值)应返回什么。 我建议将这两种方法合而为一,它看起来应该像这样,请注意,只有this.employees类型为Collection的情况下,此方法才有效:

    public Optional<Employee> findById(long id) {
        return this.employees.stream()
            .filter(employee -> employee.getId() == id)
            .findAny();
    }
    
  2. findById方法应返回默认值,例如,空的员工在其字段中没有任何值,我建议这样做:

    public Employee findlById(long id) {
       return find(id).orElse(new Employee());
    } 
    
  3. 如果找不到找到的员工,findById方法应引发异常,这也可以使用可选的方法来完成:

    public Employee findlById(long id) {
        return find(id).orElseThrow(new RuntimeException("Cannot find required employee"));//Maybe throw your own exception
    }
    
  4. 如果找不到找到的员工,findById应该返回null,这也可以使用orElse方法来完成:

    public Employee findlById(long id) {
        return find(id).orElse(null);
    } 
    

答案 4 :(得分:-1)

    public Employee findlById(long id) { 
       Employee finalEmployee;
       Optional<Employee> employee = find(id); 
       if (employee.isPresent()) { 
          finalEmployee=employee.get(); 
       } 
       return finalEmployee; 
   }