Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 308
Moshiour Avatar asked Nov 17 '19 05:11

Moshiour


People also ask

What is optional <> in Java?

Optional is a container object used to contain not-null objects. Optional object is used to represent null with absent value. This class has various utility methods to facilitate code to handle values as 'available' or 'not available' instead of checking null values.

What exception is thrown by optional get when not nested within optional isPresent?

NoSuchElementException Exception Via orElseThrow() Since Java 10. Using the Optional. orElseThrow() method represents another elegant alternative to the isPresent()-get() pair. Sometimes, when an Optional value is not present, all you want to do is to throw a java.

How do you know if optional is present?

Once you have created an Optional object, you can use the isPresent() method to check if it contains a non-null value. If it does, you can use the get() method to retrieve the value. Developers can also use the getOrElse() method, which will return the value if it is present, or a default value if it is not.


2 Answers

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.

like image 160
S.R. Avatar answered Oct 13 '22 11:10

S.R.


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);
like image 23
Deadpool Avatar answered Oct 13 '22 11:10

Deadpool