I have this Java 8 code:
public Optional<User> getUser(String id) {
Optional<User> userFromCache = cache.getUser(id);
if (userFromCache.isPresent()) {
return userFromCache;
}
return repository.getUser(id);
}
It works fine but I'm wondering how can I chain the call to not to use if
. I have tried with orElseGet
but it doesn't allow to return another Optional<User>
but a User
.
I want something like this:
Optional<User> userFromCache = cache.getUser(id)
.orElseGet(() -> repository.getUser(id));
The empty method of the Optional method is used to get the empty instance of the Optional class. The returned object doesn't have any value.
The orElse() method will return the value present in an Optional object. If the value is not present, then the passed argument is returned.
You can create an Optional object using the of() method, which will return an Optional object containing the given value if the value is non-null, or an empty Optional object if the value is null.
Since Java 9, there is Optional.or
. It accepts a supplier for another Optional
.
return cache.getUser(id).or(() -> repository.getUser(id));
You can create an optional based on a nullable value from other optionals:
public Optional<User> getUser(String id) {
return Optional.ofNullable(
cache.getUser(id).orElseGet(
() -> repository.getUser(id).orElse(null)
)
);
}
But your current solution is clearly more readable.
You can still use ?:
return (userFromCache.isPresent()) ? userFromCache : repository.getUser(id);
It's obviously an if in disguise but so is any other solution.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With