Retorno opcional ya que es opcional si el valor devuelto tiene, otra llamada de otra función

adimoh:

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?

VV Ole:

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 Optionalregresar de func1tiene 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 Optionals de func1y 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::ofenvolturas el Optionalde func1dentro embargo, un Optionalsólo si tiene un valor, de la que orElsedesenvuelve de nuevo.

Si la llamada a func2es caro, es posible que desee evitar que cuando no es necesario (cuando se func1proporciona 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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=180638&siteId=1
Recomendado
Clasificación