Moshiour
Moshiour

Reputation: 673

Throw exception if Optional<> value is present

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

Answers (2)

Ryuzaki L
Ryuzaki L

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

S.R.
S.R.

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

Related Questions