为了账号安全,请及时绑定邮箱和手机立即绑定

可选的<String> 映射函数返回 null

可选的<String> 映射函数返回 null

白衣染霜花 2021-08-25 10:11:43
有人可以帮我处理下面的代码吗?我想要一个等效的使用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".请注意,原始代码是由其他人编写的。因为它有很多依赖项,所以我无法更改输入/输出参数。:(
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

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()到 a 中来跟踪它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前面示例中的 a。相反,我们可以检查value.isPresent():


public String getMyRequiredValue4(Optional<String> value) {

    return value.flatMap(this::getAnotherValue) 

                .orElse(value.isPresent() ? null : "Random");

}


查看完整回答
反对 回复 2021-08-25
  • 1 回答
  • 0 关注
  • 230 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信