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

Mos*_*our 5 java optional java-8

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

Optional<Branch> findByName(@Nonnull final String name);
Run Code Online (Sandbox Code Playgroud)

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

我可以这样做例如:

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

或另一种方式:

Optional.of(branchRepository.findByName(branch.getName()))
                .filter(Optional::isEmpty)
                .orElseThrow(NameNotAvailableException::new);
Run Code Online (Sandbox Code Playgroud)

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

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

小智 9

您最好使用“存在”。

if (repository.existsByName(branchName)) {
    throw ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Moshiour您已经在使用副作用和异常了。即使使用Optional,命令式代码也不会起作用。 (2认同)

Dea*_*ool 7

您可以使用ifPresentwith块引发异常

branchRepository.findByName(branch.getName()).ifPresent(s -> {
    throw new NameNotAvailableException();
});
Run Code Online (Sandbox Code Playgroud)

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

if(branchRepository.findByName(branch.getName()).isPresent()) {
    throw new NameNotAvailableException();
}
Run Code Online (Sandbox Code Playgroud)

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

public void throwException(Object str) {
    throw new NameNotAvailableException();
}
Run Code Online (Sandbox Code Playgroud)

然后就叫它

branchRepository.findByName(branch.getName()).ifPresent(this::throwException);
Run Code Online (Sandbox Code Playgroud)

  • @Moshiour Honestly(意见),如果您想设计一个简洁的API,那么用于存在检查的`findByName`也不是一个简洁的设计(请参阅[其他答案](https://stackoverflow.com/a/ 58898186/1746118))!是的,“ if(branchRepository.findByName(branch.getName())。isPresent())”是您可以对现有负债进行的最简单检查。 (3认同)
  • @Moshior-我想你是在和错误的人吵架。死侍为您提供了3种选择,我认为没有其他任何明显不同的选择。如果您都不接受它们,那么&gt;&gt; we &lt;&lt;对此无能为力。向Java开发团队提交错误报告/增强请求。 (2认同)