我有一连串的方法,其中一个方法的返回类型为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
,我会感到困惑吗?
答案 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的员工,应该返回什么。有以下选择-
findById()
的调用者可以返回为空,则返回空答案 3 :(得分:0)
我没有完整的信息来建议您所需的具体答案,但我可以建议4种可能合适的解决方案:
findById
方法应自行返回可选的it。这使您可以方便地确定每种情况(如果找不到该值)应返回什么。
我建议将这两种方法合而为一,它看起来应该像这样,请注意,只有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).orElse(new Employee());
}
如果找不到找到的员工,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 :(得分:-1)
public Employee findlById(long id) {
Employee finalEmployee;
Optional<Employee> employee = find(id);
if (employee.isPresent()) {
finalEmployee=employee.get();
}
return finalEmployee;
}