Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Optional if object is not null - returns the method result, if null - returns default value

Tags:

java

Is it possible to transform this code to a Java 8 Optional one-line expression?

long lastPollTime; if (object != null) {     lastPollTime = object.getTime(); } else {     lastPollTime = 0; } 

i.e. if some object is not null, I need to call an object method and return its result, or else return 0. Optional.ofNullable().orElse() is not suitable, as it returns the object of the same type, but i need the result of the method call or some default value.

like image 563
mv200580 Avatar asked Jan 13 '17 09:01

mv200580


People also ask

Which option can be used to return an object if Optional is not null?

i.e. if some object is not null, I need to call an object method and return its result, or else return 0. Optional. ofNullable().

Can an Optional return null Java?

Optional isn't magic, it's an object like any other, and the Optional reference itself can be null. It's the contents of the Optional that can't be null.

What does Optional of null return?

Optional ofNullable() method in Java with examples If the specified value is null, then this method returns an empty instance of the Optional class. Parameters: This method accepts value as parameter of type T to create an Optional instance with this value. It can be null.

Which method will return a default value when Optional instance is empty?

Java 8 – Optional orElse() and orElseGet() methods These two methods orElse() and orElseGet() returns the value of Optional Object if it is no empty, if the object is empty then it returns the default value passed to this method as an argument.


2 Answers

A few forms:

long lastPollTime = Optional.ofNullable(object).map(o -> o.getTime()).orElse(0L);  long lastPollTime = Optional.ofNullable(object).map(YouObjectClass::getTime).orElse(0L);  long lastPollTime = Optional.ofNullable(object).isPresent() ? object.getTime() : 0;  long lastPollTime = object != null ? object.getTime() : 0; 

Of these, the last one, which doesn't use Optional (and therefore doesn't strictly answer your question!) is simpler to read and has fewer runtime overheads, and so should be preferred.

Arguably, it's even simpler if you reverse the options:

long lastPollTime = object == null ? 0 : object.getTime(); 

... although you might prefer to have the default last -- it's a matter of personal taste.


If you really can't use ternary operators, and you're doing this a lot, you could write your own utility method:

public <T,U> U mapWithFallback(T obj, Function<T,U> function, U fallback) {     if(obj == null) {         return fallback;     } else {         return function.apply(obj);     } } 

... callable as:

long lastPollTime = mapWithFallback(object, o -> o.getTime(), 0); 

... or make a complete mockery of your no-ternaries check using:

public <T,U> U ifElse( Supplier<Boolean> a, Supplier<U> ifTrue, Supplier<U> ifFalse) {      if(a.get()) {           return ifTrue.get();      } else {           return ifFalse.get();      } }  long lastPollTime = ifElse( () -> object == null, () -> object.getTime(), () -> 0); 

It's in even better taste to avoid null references altogether, so that this kind of check isn't needed -- for example using the Null Object pattern.

... or by writing methods that return Optional rather than potential nulls. Optional is a great class; use it. Just don't convert something to Optional purely so you can immediately check whether it's empty.

like image 167
slim Avatar answered Sep 18 '22 19:09

slim


long lastPollTime = Optional.ofNullable(object).map(YouObjectClass::getTime).orElse(0L); 
like image 22
Vlad Bochenin Avatar answered Sep 18 '22 19:09

Vlad Bochenin