如何避免使用Optional.get和Optional.isPresent

Chr*_*311 5 refactoring optional java-8

public ValueA map(ValueB valueB, Date date) {
    Optional<ValueC> valueCOpt = find(valueB);
    if (valueCOpt.isPresent()) {
        ValueC valueC = valueCOpt.get();
        // call many getters on valueC and do a lot of logic with it.
        return map(/*some parameters*/);
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

这看起来很难看.期权的优势在这里完全消失了.我读到应该使用mapflatMap代替get.但如果我更换每个吸气剂,这真的是一个好处

valueC.getFieldA()
Run Code Online (Sandbox Code Playgroud)

valueCOpt.map(ValueC::getFieldA)
Run Code Online (Sandbox Code Playgroud)

你知道一些常见的或最好的做法吗?

Hol*_*ger 8

您可以使用

public ValueA map(ValueB valueB, Date date) {
    return find(valueB)
        .map(valueC -> {
            // call many getters on valueC and do a lot of logic with it.
            return map(/*some parameters*/);
        })
        .orElse(null);
}
Run Code Online (Sandbox Code Playgroud)

关键点是只计算映射函数,如果可选项不为空,否则结果保持为空可选.如果可选项为空,orElse(null)则返回null.

  • 是的,你可以省略`.orElse(null)`让方法返回`Optional <ValueA>`,如果允许改变API,因为它需要调整所有的调用者.如果你有这个选择,这是正确的方向. (2认同)