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)
你知道这里的一些常见或最佳实践吗?
3条答案
按热度按时间trnvg8h31#
您可以使用
关键点是,Map函数仅在可选值不为空的情况下进行求值,否则,结果将保持为空可选值。如果可选项为空,
orElse(null)
将返回null
。u5rb5r592#
你需要的是Map,然后是一个orElse(),或者如果你需要一个异常,则是orElseThrow()
当需要默认值时使用orElse(),在本例中为
null
uajslkp63#
给定行
return map(/*some parameters*/);
,您是否打算创建对map
方法的递归调用?假设您没有尝试递归方法调用。。。
为了澄清,我会重新修改您的方法,使其看起来更像:
然后我将对其进行重构,以完全消除
.isPresent
和.get
方法对Optional
的调用,并将其替换为.flatMap
,如下所示:如您所见,如果
valueC
存在,.flatMap
方法可以从Optional<ValueC>
中提取valueC
,然后返回的值是手动 Package 的ValueA
。当.flatMap
在Optional<ValueC>
上被调用并且为空时,它会自动返回Optional<ValueA>.empty()
。如果在处理
valueC
期间发现ValueA
无法示例化,则必须返回Optional.empty()
,如下所示: