处理预计不会为空的 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(...);
}

随便你