Reputation: 673
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.
Upvotes: 5
Views: 5822
Reputation: 40058
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);
Upvotes: 8
Reputation: 179
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.
Upvotes: 9