Решение, изначально предложенное @ Andreas в комментариях:
public String getMyRequiredValue(Optional<String> value) {
return value.isPresent() ? getAnotherValue(value.get()).orElse(null) : "Random";
}
Решение, которое я придумал первым. Это нарушает правило, которое предполагает, что мы всегда должны проверять isPresent()
перед вызовом get()
, и вводит обработку исключений. Так что лучше придерживаться первой идеи.
public String getMyRequiredValue2(Optional<String> value) {
try {
return getAnotherValue(value.get()).orElse(null);
} catch (NoSuchElementException e) {
return "Random";
}
}
Я видел, как вы пытались использовать map
и flatMap
. Если они приводят к Optional.empty()
, неясно, откуда взялась null
: это может быть value
или getAnotherValue(value.get())
.
Мы можем отследить это, сохранив значение из value.get()
в 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);
}
Опять же, первый подход все еще превосходит это.
РЕДАКТИРОВАТЬ: Как указано @ Holder , нам не нужно Holder
из предыдущего примера. Вместо этого мы можем проверить value.isPresent()
:
public String getMyRequiredValue4(Optional<String> value) {
return value.flatMap(this::getAnotherValue)
.orElse(value.isPresent() ? null : "Random");
}