orElse 还是 orElseGet?

109 阅读1分钟

背景

在使用Optional判空做后续处理时,有方法orElse()orElseGet()两种,这两个方法,都会在Optional.ofNullable()为空时返回一个自己的指定值,那此时应该怎么来选择使用这两个方法呢?接下来,就用测试来一探究竟

准备测试

准备一个测试类

public static class Arvin {  
    public Arvin(String x) {  
        System.out.println("arvin init..." + x);  
    }  
}

测试用例1 当Optional.ofNullable()不为空时

public static void main(String[] args) {
    Arvin x = new Arvin("1");
    Optional.ofNullable(x).orElse(new Arvin("2"));
    Optional.ofNullable(x).orElseGet(() -> new Arvin("3"));

}

执行结果

/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home/bin/java
arvin init...1
arvin init...2

测试用例2 当Optional.ofNullable()为空时

public static void main(String[] args) {
    Arvin x = null;
    Optional.ofNullable(x).orElse(new Arvin("2"));
    Optional.ofNullable(x).orElseGet(() -> new Arvin("3"));

}

执行结果

/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home/bin/java
arvin init...2
arvin init...3

根据执行结果可见,无论Optional.ofNullable()是否为空,orElse()方法都会执行,而orElseGet()只会在Optional.ofNullable()为空时,才会实际去执行

结论

如果大部分场景下,使用Optional.ofNullable()方法为空时,才返回指定对象,使用orElseGet()方法更为合适,orElse()方法,则更适合无论如何都需要执行的场景