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

前端 未结 5 1712
伪装坚强ぢ
伪装坚强ぢ 2020-12-23 21:26

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

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


        
5条回答
  •  攒了一身酷
    2020-12-23 21:52

    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  U mapWithFallback(T obj, Function 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  U ifElse( Supplier a, Supplier ifTrue, Supplier 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.

提交回复
热议问题