有人可以帮我处理下面的代码吗?我想要使用Optional
函数的等效项。
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) { ... }
请注意,我尝试过此操作,但它不起作用
return value.map(lang -> getAnotherValue(lang).orElse(null)).orElse("Random");
不起作用的是-当值存在并且getAnotherValue
返回Optional.empty()
时,我希望原始函数返回null
。现在正在返回"Random"
。
我的假设是,由于map
方法返回null
,因此它被"Random"
取代。
请注意,原始代码是由其他人编写的。由于它具有很多依赖性,因此我无法更改输入/输出参数。 :(
答案 0 :(得分:4)
@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");
}