Ответ 1
Несколько форм:
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;
Из них последний, который не использует Optional (и, следовательно, не дает точного ответа на ваш вопрос!), Проще для чтения и имеет меньше накладных расходов во время выполнения, и поэтому должен быть предпочтительным.
Возможно, это даже проще, если вы измените параметры:
long lastPollTime = object == null ? 0 : object.getTime();
... хотя вы можете предпочесть последний по умолчанию - это вопрос личного вкуса.
Если вы действительно не можете использовать троичные операторы и часто этим занимаетесь, вы можете написать свой собственный служебный метод:
public <T,U> U mapWithFallback(T obj, Function<T,U> function, U fallback) {
if(obj == null) {
return fallback;
} else {
return function.apply(obj);
}
}
... вызывается как:
long lastPollTime = mapWithFallback(object, o -> o.getTime(), 0);
... или сделайте полное издевательство над вашей проверкой без троих, используя:
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);
Еще лучше избегать пустых ссылок, поэтому такая проверка не требуется - например, с использованием шаблона Null Object.
... или путем написания методов, которые возвращают Optional
а не потенциальные нули. Optional
отличный класс; используй это. Только не конвертируйте что-то в Optional
просто, чтобы сразу проверить, пусто ли оно.