retorno - Java Opcional si el objeto no es nulo: devuelve el resultado del método, si es nulo: devuelve el valor predeterminado
objetos null en java (5)
¿Es posible transformar este código en java 8 Expresión de una línea opcional?
long lastPollTime;
if (object != null) {
lastPollTime = object.getTime();
} else {
lastPollTime = 0;
}
es decir, si algún objeto no es nulo, necesito llamar al método de objeto y devolver su resultado, o bien devolver el 0. Optional.ofNullable (). orElse () no es adecuado, ya que devuelve el objeto del mismo tipo, pero necesito El resultado de la llamada al método o algún valor por defecto.
Algunas formas:
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;
De estos, el último, que no usa Opcional (¡y por lo tanto no responde estrictamente a su pregunta!) Es más fácil de leer y tiene menos gastos generales de tiempo de ejecución, por lo que debería preferirse.
Podría decirse que es incluso más sencillo si invierte las opciones:
long lastPollTime = object == null ? 0 : object.getTime();
... aunque es posible que prefieras tener el último valor predeterminado, es una cuestión de gusto personal.
Si realmente no puede usar operadores ternarios, y está haciendo esto mucho, podría escribir su propio método de utilidad:
public <T,U> U mapWithFallback(T obj, Function<T,U> function, U fallback) {
if(obj == null) {
return fallback;
} else {
return function.apply(obj);
}
}
... llamada como:
long lastPollTime = mapWithFallback(object, o -> o.getTime(), 0);
... o haga una burla completa de su cheque de no-ternarios usando:
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);
Es incluso mejor para evitar las referencias nulas por completo, por lo que no es necesario este tipo de comprobación, por ejemplo, utilizando el patrón de Objeto nulo .
puedes hacer como abajo con java 8
long lastPollTime=Optional.ofNullable(object).isPresent()?object.getTime():0;
o sin usar java8 como este
long lastPollTime = object != null ?object.getTime():0;
long lastPollTime = Optional.ofNullable(object).map(o -> o.getTime()).orElse(0L);
En lugar de o -> o.getTime()
podría usar una referencia de métodos como ClassOfObject::getTime
long lastPollTime = Optional.ofNullable(object).map(YouObjectClass::getTime).orElse(0L);
long lastPollTime = object != null ?object.getTime():0;