美文网首页
Java Optional中orElse()和orElseGet

Java Optional中orElse()和orElseGet

作者: 夜阑w | 来源:发表于2019-03-12 18:41 被阅读0次

    这两个方法表示当Optional对象里面的值为空的时候,返回一个默认的值。这个方法极其相似,甚至在很多情况下可以相互替代,但是仍旧有一些不同。

    1. 传入参数不同

    public T orElse(T other)
    public T orElseGet(Supplier<? extends T> other)
    

    orElse()接受类型T的任何参数,而orElseGet()接受类型为Supplier的函数接口,该接口返回类型为T的对象 。

    • orElse():如果有值则将其返回,否则返回指定的其它值。
    • orElseGet():如果有值则将其返回,否则调用函数并将其返回调用结果。

    2. 使用时的区别

    举例说明:
    当Optional有值时:

    public class OptionalTest {
        public static void main(String[] args) {
            List<Integer> list = Arrays.asList(10, 20, 30);
            int a = list.stream().reduce(Integer::sum).orElse(get("a"));
            int b = list.stream().reduce(Integer::sum).orElseGet(() -> get("b"));
            System.out.println("a = " + a);
            System.out.println("b = " + b);
        }
    
        public static int get(String name) {
            System.out.println(name + "执行了方法");
            return 1;
        }
    }
    

    输出结果:

    a执行了方法
    a = 60
    b = 60
    

    当Optional值为空时:

    public class OptionalTest {
        public static void main(String[] args) {
            List<Integer> list = Arrays.asList();
            int a = list.stream().reduce(Integer::sum).orElse(get("a"));
            int b = list.stream().reduce(Integer::sum).orElseGet(() -> get("b"));
            System.out.println("a = " + a);
            System.out.println("b = " + b);
        }
    
        public static int get(String name) {
            System.out.println(name + "执行了方法");
            return 1;
        }
    }
    

    输出结果:

    a执行了方法
    b执行了方法
    a = 1
    b = 1
    

    由上可以发现,orElse()方法在Optional值为非空时,也会计算传入的参数,而orElseGet()方法只有在Optional值为空时才会执行传入的函数。

    3. 性能上的区别

    由于orElseGet()不是每次都会调用传入的方法,所以orElseGet()方法在性能上要优于orElse()方法。

    一般情况下,使用orElseGet()方法更好,除非默认对象已经定义好可以直接访问。

    相关文章

      网友评论

          本文标题:Java Optional中orElse()和orElseGet

          本文链接:https://www.haomeiwen.com/subject/mxonpqtx.html