在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());

07-24 22:18