Alguien me puede ayudar con el siguiente fragmento de código? Me gustaría un equivalente utilizando Optional
funciones.
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 getAnotherValue
vuelve Optional.empty()
Quiero la función original para volver null
. Se está volviendo "Random"
ahora.
Mi suposición es desde los map
método devuelve null
el 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. :(
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 map
y flatMap
. Si resultan en una Optional.empty()
, no está claro dónde null
procedían de: podría ser cualquiera value
o 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 Holder
procedente 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");
}