处理预计不会为空的 Optional
Handling the Optional which doesn't expected to be empty
我有以下方法
private Invoice createInvoice(SomeParameter someParameter) {
Invoice invoice = new Invoice();
Optional<Customer> customer = customerRepository.findByCode(someParameter.getCustomerCode());
invoice.Customer(resource.get());
return this.createInvoice(...);
}
我正在查找将分配给发票的客户。参数中的客户代码不可能在数据库中不存在。
无论如何,我知道直接调用可选的 get()
方法是一种不好的做法,但我仍然不想检查该值是否存在,这看起来像一些样板代码。还有其他字段如客户是可选的。
有没有更好的方法来处理这里的可选?
There is no chance that the customer code in the parameter does not
exist in the DB.
如果您确定结果存在于您获得的可选对象中,那么您应该调用 orElseThrow()
而不是 get()
,它的作用相同 - 检索值 (如果存在),但与get()
相反,它表明如果可选对象不包含结果,您打算明确抛出NoSuchElementException
。
此方法有一个重载版本,它需要一个 Throwable
类型的供应商,并允许为空可选的情况提供所需的异常类型。
如果您不想处理可选的,那么不要从存储库方法中 return 它,只需 return Customer
实体。如有必要,您也可以 annotate your repository method 和 @Nullable
。
interface CustomerRepository extends Repository<Customer, Long> {
Customer findByCode(...);
// or
@Nullable
Customer findByCode(...);
}
private Invoice createInvoice(SomeParameter someParameter) {
Invoice invoice = new Invoice();
Optional<Customer> customer = customerRepository.findByCode(someParameter.getCustomerCode());
//1.invoice.Customer(resource.orElse(null));
//2.resource.ifPresent(res->invoice.Customer(res));
//3.invoice.Customer(resource.orElseThrow(()->new Exception("xxx")));
return this.createInvoice(...);
}
随便你
我有以下方法
private Invoice createInvoice(SomeParameter someParameter) {
Invoice invoice = new Invoice();
Optional<Customer> customer = customerRepository.findByCode(someParameter.getCustomerCode());
invoice.Customer(resource.get());
return this.createInvoice(...);
}
我正在查找将分配给发票的客户。参数中的客户代码不可能在数据库中不存在。
无论如何,我知道直接调用可选的 get()
方法是一种不好的做法,但我仍然不想检查该值是否存在,这看起来像一些样板代码。还有其他字段如客户是可选的。
有没有更好的方法来处理这里的可选?
There is no chance that the customer code in the parameter does not exist in the DB.
如果您确定结果存在于您获得的可选对象中,那么您应该调用 orElseThrow()
而不是 get()
,它的作用相同 - 检索值 (如果存在),但与get()
相反,它表明如果可选对象不包含结果,您打算明确抛出NoSuchElementException
。
此方法有一个重载版本,它需要一个 Throwable
类型的供应商,并允许为空可选的情况提供所需的异常类型。
如果您不想处理可选的,那么不要从存储库方法中 return 它,只需 return Customer
实体。如有必要,您也可以 annotate your repository method 和 @Nullable
。
interface CustomerRepository extends Repository<Customer, Long> {
Customer findByCode(...);
// or
@Nullable
Customer findByCode(...);
}
private Invoice createInvoice(SomeParameter someParameter) {
Invoice invoice = new Invoice();
Optional<Customer> customer = customerRepository.findByCode(someParameter.getCustomerCode());
//1.invoice.Customer(resource.orElse(null));
//2.resource.ifPresent(res->invoice.Customer(res));
//3.invoice.Customer(resource.orElseThrow(()->new Exception("xxx")));
return this.createInvoice(...);
}
随便你