Let's consider a method that returns an Optional class. Mainly, this method computes an Optional class and, if it isn't empty, then it simply returns this Optional class. Otherwise, if the computed Optional class is empty then we execute some other action that also returns Optional class.
The isPresent()-get() pair can do it as follows (this should be avoided):
private final static String BOOK_STATUS = "UNKNOWN";
...
// Avoid
public Optional<String> findStatus() {
Optional<String> status = ...; // this is prone to be empty
if (status.isPresent()) {
return status;
} else {
return Optional.of(BOOK_STATUS);
}
}
Alternatively, we should avoid such constructions as follow:
return Optional.of(status.orElse(BOOK_STATUS));
return Optional.of(status.orElseGet(() -> (BOOK_STATUS)));
The best solution has been available since with JDK 9, and it consists of the Optional.or() method. This method is capable of returning Optional describing the value. Otherwise, it returns Optional produced by the given Supplier function (the supplying function that produces Optional to be returned):
private final static String BOOK_STATUS = "UNKNOWN";
...
// Prefer
public Optional<String> findStatus() {
Optional<String> status = ...; // this is prone to be empty
return status.or(() -> Optional.of(BOOK_STATUS));
}