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

时间:2017-04-04 08:58:36

标签: java-8 refactoring optional

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;
}

这看起来很难看。期权的优势在这里完全消失了。我读到应该使用mapflatMap代替get。但如果我更换像

这样的每个吸气剂,这真的是一个好处
valueC.getFieldA()

valueCOpt.map(ValueC::getFieldA)

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

2 个答案:

答案 0 :(得分: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);
}

关键点是,仅当可选项不为空时才评估映射函数,否则,结果将保持为空可选。如果可选项为空,orElse(null)将返回null

答案 1 :(得分:3)

如果您需要例外,您需要的是映射,然后是orElse()或orElseThrow()

ValueA valueA = valueCOpt.map(valueC -> mapToValue(valueC))
       .orElse(null);
需要默认值时使用

orElse(),在这种情况下为null