我试图在Java中使用Optional而不是标准的null检查
@Data
public class InputObj {
private Double savings;
}
@Data
public class Result {
private String outputSavings;
}
public Result convertInputObjToResult(InputObj inputObj){
Result result = new Result();
Optional<InputObj> optionalInputObj = Optional.ofNullable(inputObj);
optionalMembershipDetails.map(InputObj::getSavings).map(value -> util.convertRoundAndAbs(value,true)).ifPresent(result::setOutputSavings);
return result;
}
相当于下面的内容
public Result convertInputObjToResult(InputObj inputObj){
Result result = new Result();
if(inputObj != null){
if(inputObj.getSavings() != null){
result.setOutputSavings(util.convertRoundAndAbs(inputObj.getSavings(),true));
}
}
return result;
}
我写了一些测试用例,但没有得到任何Null Pointer Exception,但是我无法理解ifPresent条件已经结束,而map在之前,但是我仍然没有得到任何NPE。您是否发现此代码有什么问题或如何改进?这是Spring Boot应用程序的一部分,@ Data批注用于lombok。
除了错字“ optionalMembershipDetails”,代码没有问题。假设您打算使用“ optionalInputObj”。您需要阅读有关Java流的信息才能理解完整的概念。简而言之,以惰性方式评估操作。因此,ifPresent调用将触发在其之前出现的操作。在这种情况下,对象被包装在可选操作内,因此每个中间操作都将另一个可选操作传递给下一个操作。拥有Optional可防止您获得NPE。
这里是Java Optional类的a link to further describe how the map operation works。
如果存在值,则将提供的映射函数应用于它,如果结果为非null,则返回描述结果的Optional。否则,返回一个空的Optional。
因此,如果从map
方法获得空值,它将自动转换为Optional.empty()
。
然后,取look at the ifPresent method
如果存在值,则使用该值调用指定的使用者,否则不执行任何操作。
所以这就是为什么您没有任何NPE的原因;映射操作能够将null
结果或传递的值映射到Optional.empty()
,并且如果传递空的Optional,则ifPresent
操作不会执行。