可选的 map函数返回null

问题描述 投票:4回答:1

有人可以用下面的代码帮助我吗?我想要使​​用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"取代。

请注意,原始代码是由其他人编写的。既然,它有很多依赖关系,我无法改变输入/输出参数。 :(

java java-8 refactoring optional optional-parameters
1个回答
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";
    }
}

我见过你正在尝试利用mapflatMap。如果他们导致Optional.empty(),则不清楚null来自哪里:它可能是valuegetAnotherValue(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");
}
© www.soinside.com 2019 - 2024. All rights reserved.