Throw exception if Optional<> value is present

老子叫甜甜 提交于 2020-01-11 08:53:09

问题


Suppose I have a Spring Data Repository method.

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

My business logic is such if I find any value for this method execution I would throw an exception.

I could do this for example :

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

or another way:

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

I am not sure if using filter, in this case, is appropriate as my method returns Optional<Branch> not a list. It seems that if in JDK if there were ifPresentThrow() method was available that would serve my purpose.

Yes, this code can be written in an imperative style which I don't want. So my question is the same kind of things ifPresentThrow() can be achieved or there is a better way to do it in a functional style. Thanks in advance.


回答1:


You'd better use "exists".

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

It more usefull, because it doesn't retrive the object from db, just true/false.




回答2:


You can use ifPresent with block to throw an exception

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

Or a simple if block also looks cleaner

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

Or you can create a method to just throw an exception

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

And then just call it

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


来源:https://stackoverflow.com/questions/58897853/throw-exception-if-optional-value-is-present

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!