Opcionales <cadena> devuelve la función nula mapa

meso:

Alguien me puede ayudar con el siguiente fragmento de código? Me gustaría un equivalente utilizando Optionalfunciones.

public String getMyRequiredValue(Optional<String> value) {
    if(value.isPresent()) {
        Optional<String> optionVal = getAnotherValue(value.get());
        if(optionVal.isPresent()) {
            return optionVal.get();
        } else {
            return null;
        }
    } else {
        return "Random";
    }
}

public Optional<String> getAnotherValue(String value) { ... }

Sólo una nota He intentado esto, pero no funciona

return value.map(lang -> getAnotherValue(lang).orElse(null)).orElse("Random");

Lo que no funciona es - cuando el valor está presente y getAnotherValuevuelve Optional.empty()Quiero la función original para volver null. Se está volviendo "Random"ahora.

Mi suposición es desde los mapmétodo devuelve nullel fichero es reemplazado por "Random".

Tenga en cuenta que el código original fue escrito por otra persona. Desde entonces, se tiene un gran número de dependencias, no puedo cambiar los parámetros de entrada / salida. :(

Andrew Tobilko:

La solución sugerida originalmente por @Andreas en los comentarios:

public String getMyRequiredValue(Optional<String> value) {
    return value.isPresent() ? getAnotherValue(value.get()).orElse(null) : "Random";
}

La solución que se me ocurrió primero. Se rompe la regla de que, sugieren que no siempre hay que comprobar isPresent()antes de llamar get()y manejo introduce una excepción. Así que es mejor quedarse con la primera idea.

public String getMyRequiredValue2(Optional<String> value) {
    try {
        return getAnotherValue(value.get()).orElse(null);
    } catch (NoSuchElementException e) {
        return "Random";
    }
}

He visto que estaba tratando de utilizar mapy flatMap. Si resultan en una Optional.empty(), no está claro dónde nullprocedían de: podría ser cualquiera valueo getAnotherValue(value.get()).

Podríamos realizar un seguimiento de que guardando el valor que viene de value.get()en una Holder<String>:

public String getMyRequiredValue3(Optional<String> value) {
    final Holder<String> holder = new Holder<>();
    return value.flatMap(i -> getAnotherValue(holder.value = i))
                .orElse(holder.value == null ? "Random" : null);
}

Una vez más, el primer enfoque aún mejor que este.


EDIT: Como se ha señalado por @Holder , no necesitamos una Holderprocedente del ejemplo anterior. En su lugar podemos comprobar value.isPresent():

public String getMyRequiredValue4(Optional<String> value) {
    return value.flatMap(this::getAnotherValue) 
                .orElse(value.isPresent() ? null : "Random");
}

Supongo que te gusta

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