Tengo dos métodos func1 y func2 que devuelven opcional. Retorno opcional ya que es opcional si el devueltos desde func1 tiene valor, func2 llamada demás y volver a su facultativo. Una de ellas es el uso if-else
.
Optional<MyObject> opt1 = func1();
if (opt1.isPresent()) {
return opt1;
}
return func2();
Sin embargo, deseo de lograr que el uso de Java 8 opcional y evitar if-else
.
Algo como:
return Optional.of(obj1)
.flatMap_returnOptionalIfvaluePresent(func1)
.orElseReturnOptionalFromThis(func2)
¿Puede alguien sugerir una manera buena para él?
Editar: or
Java 9 y posterior ofrecen una solución muy elegante:
Optional<String> myFunc() {
return func1().or(this::func2);
}
or
(introducido en Java 9) hace exactamente lo que pidieron: Si el Optional
regresar de func1
tiene un valor, se devuelve (o un equivalente Optional
). Si no es así, el proveedor (en este caso func2()
) se invoca para obtener una Optional
, que se devuelve a continuación.
Java 8
Hay varias maneras. En Java 8 Prefiero tomar los valores de la Optional
s de func1
y func2
:
Optional<String> myFunc() {
String returnValue = func1().orElse(func2().orElse(null));
return Optional.ofNullable(returnValue);
}
Edición 2: @ sugerencia alternativa de Holger en un comentario es lo suficientemente bueno para citar dentro de la respuesta (Holger, es posible que haya publicado como un comentario sólo porque la cuestión está cerrada y que por lo tanto no podría publicar su propia respuesta):
return func1().map(Optional::of).orElse(func2());
Se sigue el camino opuesto: El mapeo usando Optional::of
envolturas el Optional
de func1
dentro embargo, un Optional
sólo si tiene un valor, de la que orElse
desenvuelve de nuevo.
Si la llamada a func2
es caro, es posible que desee evitar que cuando no es necesario (cuando se func1
proporciona un valor):
String returnValue = func1().orElseGet(() -> func2().orElse(null));
O en la versión de Holger:
return func1().map(Optional::of).orElseGet(this::func2);
isPresent
utilizado en un par de otras respuestas es así de bajo nivel, que rara vez lo uso y sólo como último recurso.