Java Необязательно, если объект не равен null - возвращает результат метода, если null - возвращает значение по умолчанию

Можно ли преобразовать этот код в java 8 Необязательное однострочное выражение?

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

то есть. если какой-либо объект не является нулевым, мне нужно вызвать метод объекта и вернуть его результат, или вернуть 0. Необязательный .ofNullable(). OrElse() не подходит, поскольку он возвращает объект того же типа, но мне нужен результат вызова метода или какого-либо значения по умолчанию.

Ответ 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 просто, чтобы сразу проверить, пусто ли оно.

Ответ 2

long lastPollTime = Optional.ofNullable(object).map(YouObjectClass::getTime).orElse(0L);

Ответ 3

long lastPollTime = Optional.ofNullable(object).map(o -> o.getTime()).orElse(0L);

Вместо o -> o.getTime() вы можете использовать ссылку на методы, например ClassOfObject::getTime

Ответ 4

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

Ответ 5

вы можете сделать, как показано ниже, с помощью java 8

long lastPollTime=Optional.ofNullable(object).isPresent()?object.getTime():0;

или без использования java8, как это

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