在Optional中,当调用optional.orElse方法时,无论是否存在元素,都将不执行orElse部分,它不会充当if else条件。
在下面的代码中,如果您在中看到案例1 ,则同时执行getNullPoJo和getDefaultPoJo,因为getNullPoJo将返回空
在情况2 中,您将获得一个带有已加载值的Optional(从getLoadedPoJo),您还将执行getDefaultPoJo
我只是想了解optional.orElse的工作方式。
public static void main (String [] a) {
PoJo poJo1=getNullPoJo().orElse(getDefaultPoJo());//Case 1
System.out.println("pojo1 Got "+poJo1.getVariable());
PoJo poJo2=getLoadedPoJo().orElse(getDefaultPoJo());//Case 2
System.out.println("pojo2 Got "+poJo2.getVariable());
}
private static Optional<PoJo> getNullPoJo() {
System.out.println("Executing getNullPoJo");
Optional<PoJo> optional=Optional.empty();
return optional;
}
private static Optional<PoJo> getLoadedPoJo() {
System.out.println("Executing getLoadedPoJo");
PoJo poJo =new PoJo();
poJo.setVariable("Loaded");
Optional<PoJo> optional=Optional.of(poJo);
return optional;
}
private static PoJo getDefaultPoJo() {
System.out.println("Executing getDefaultPoJo");
PoJo poJo =new PoJo();
poJo.setVariable("Default");
return poJo;
}
当前输出为:我的预期输出是:
我不希望在案例2 中调用getDefaultPoJo
最佳答案
当orElseGet()
不为空时,请使用getDefaultPoJo()
避免评估Optional
:
PoJo poJo1=getNullPoJo().orElseGet(() -> getDefaultPoJo());
PoJo poJo2=getLoadedPoJo().orElseGet(() -> getDefaultPoJo());