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;
}
这看起来很难看。期权的优势在这里完全消失了。我读到应该使用map
或flatMap
代替get
。但如果我更换像
valueC.getFieldA()
带
valueCOpt.map(ValueC::getFieldA)
你知道一些常见的或最好的做法吗?
答案 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