5

假设我有一个 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() 方法可用,这将符合我的目的。

是的,这段代码可以写成我不想要的命令式风格。所以我的问题是 ifPresentThrow() 可以实现同样的事情,或者有更好的方法来实现功能风格。提前致谢。

4

2 回答 2

9

你最好使用“存在”。

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

它更有用,因为它不会从数据库中检索对象,只是真/假。

于 2019-11-17T06:47:34.370 回答
8

您可以使用ifPresentwith 块抛出异常

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);
于 2019-11-17T06:00:12.517 回答