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