Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 空的'Optional'类型的返回值应该是什么?_Java_Return Value_Optional - Fatal编程技术网

Java 空的'Optional'类型的返回值应该是什么?

Java 空的'Optional'类型的返回值应该是什么?,java,return-value,optional,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(); } pu

我有一个方法链,其中一个方法的返回类型为
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);
} 

从我所阅读的internet上的资源中,对于
可选对象,您不应该返回
null
。因此,如果不是
null
而不是
what

如果返回的是
Optional
类型,那么可以使用
Optional.empty()
类似的

return Optional<Employee>.empty();
返回可选的.empty();

但是,由于您的返回类型是
Employee
,因此您的选择是将返回类型更改为
Optional
,并使用上面的,
returnnull
抛出某种类型的
异常

如果返回的是
可选类型
则可以使用
可选.empty()
类似

return Optional<Employee>.empty();
返回可选的.empty();

但是,由于您的返回类型是
Employee
,因此您的选择是将返回类型更改为
Optional
,并使用上面的,
returnnull
抛出某种类型的
异常

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

  • 如果
    findById()
    的调用方可以返回空,则返回空
  • 向您的用例抛出一个带有一些自定义消息的异常

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

  • 如果
    findById()
    的调用方可以返回空,则返回空
  • 向您的用例抛出一个带有一些自定义消息的异常
  • public Employee findlById(长id){
    员工、财务人员;
    可选员工=查找(id);
    如果(employee.isPresent()){
    finalEmployee=employee.get();
    } 
    返回最终雇员;
    }
    
    公共员工FindByID(长id){
    员工、财务人员;
    可选员工=查找(id);
    如果(employee.isPresent()){
    finalEmployee=employee.get();
    } 
    返回最终雇员;
    }
    
    我没有完整的信息来为您提供所需的具体答案,但我可以建议4种可能适合您的解决方案:

  • findById
    方法应该返回可选的it self。这使您能够为每种情况决定在未找到值时应返回的内容。 我建议将这两种方法合并为一种,它应该是这样的,请注意,只有当this.employees属于
    Collection
    :

    public Optional<Employee> findById(long id) {
        return this.employees.stream()
            .filter(employee -> employee.getId() == id)
            .findAny();
    }
    
  • 如果未找到搜索到的员工,则
    findById
    方法应引发异常,也可以使用可选的:

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

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

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

  • findById
    方法应该返回可选的it self。这使您能够为每种情况决定在未找到值时应返回的内容。 我建议将这两种方法合并为一种,它应该是这样的,请注意,只有当this.employees属于
    Collection
    :

    public Optional<Employee> findById(long id) {
        return this.employees.stream()
            .filter(employee -> employee.getId() == id)
            .findAny();
    }
    
  • 如果未找到搜索到的员工,则
    findById
    方法应引发异常,也可以使用可选的:

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

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

  • 取决于合同的方法。假设id来自用户输入-很可能您没有具有该id的员工。您需要在程序中处理错误。由于对控制流使用异常通常是一种不好的做法-返回
    可选值或
    null

    如果您希望该ID的员工存在-该ID可能是从您从程序的另一部分收到的列表中传递的-最好抛出
    异常。(在这种情况下,我建议使用不同的函数名称—类似于
    getEmployeeDetails


    最后,你如何处理完全取决于你的需求-我怀疑是否有一个好的单一的解决方案。

    取决于方法的契约。假设id来自用户输入-很可能你没有一个具有该id的员工。预计你处理程序内的错误。因为对控制流使用异常通常是一种不好的做法-返回
    可选值
    null

    如果您希望该ID的员工存在-该ID可能是从您从程序的另一部分收到的列表中传递的-最好抛出
    异常
    。(在这种情况下,我建议该函数使用不同的名称-类似于
    getEmployeeDetails


    最后,您如何处理完全取决于您的需求-我怀疑是否有好的单一的解决方案。

    我不喜欢将
    可选的
    类型进一步向上移动,只想解决这一层的条件。其他两个选项
    空的
    抛出异常(throw Exception)
    听起来更好。@MeenaChaudhary只是想完整一点。这些是你的选择。我不想把
    可选的
    类型移到链的上游,只想解决这一层的问题。另外两个选项
    null
    th