如果存在Optional <>值,则引发异常

时间:2019-11-17 05:42:36

标签: java java-8 optional

假设我有一个Spring Data Repository方法。

Optional<Branch> findByName(@Nonnull final String name);

如果我发现此方法执行有任何价值,我的业务逻辑就会抛出异常。

例如,我可以这样做:

Optional.of(branchRepository.findByName(branch.getName()))
                .filter(bo -> !bo.isPresent())
                .orElseThrow(NameNotAvailableException::new);

或另一种方式:

Optional.of(branchRepository.findByName(branch.getName()))
                .filter(Optional::isEmpty)
                .orElseThrow(NameNotAvailableException::new);

我不确定在这种情况下使用过滤器是否合适,因为我的方法返回Optional<Branch> 没有清单。 似乎在JDK中,如果有ifPresentThrow()方法可用,那将达到我的目的。

是的,可以使用我不希望使用的命令式代码来编写此代码。所以我的问题是,是否可以实现PresentThrow()或以一种更好的方式以函数样式进行操作是一样的事情。预先感谢。

2 个答案:

答案 0 :(得分:9)

您最好使用“存在”。

if (repository.existsByName(branchName)) {
    throw ...
}

它更有用,因为它不会从db中检索对象,而只是对/错。

答案 1 :(得分:7)

您可以将ifPresent与代码块一起使用以引发异常

branchRepository.findByName(branch.getName()).ifPresent(s -> {
    throw new NameNotAvailableException();
});

或者一个简单的if块看起来也更干净

if(branchRepository.findByName(branch.getName()).isPresent()) {
    throw new NameNotAvailableException();
}

或者您可以创建一个方法来引发异常

public void throwException(Object str) {
    throw new NameNotAvailableException();
}

然后调用它

branchRepository.findByName(branch.getName()).ifPresent(this::throwException);