[Java 8中使用可选和映射获取和设置值

问题描述 投票:0回答:2

我试图在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。

spring-boot java-8 optional
2个回答
0
投票

除了错字“ optionalMembershipDetails”,代码没有问题。假设您打算使用“ optionalInputObj”。您需要阅读有关Java流的信息才能理解完整的概念。简而言之,以惰性方式评估操作。因此,ifPresent调用将触发在其之前出现的操作。在这种情况下,对象被包装在可选操作内,因此每个中间操作都将另一个可选操作传递给下一个操作。拥有Optional可防止您获得NPE。


0
投票

这里是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操作不会执行。

© www.soinside.com 2019 - 2024. All rights reserved.