Java Optional中orElse()和orElseGet()的区别

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

1. 传入参数不同

public T orElse(T other)
public T orElseGet(Supplier other)

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

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

2. 使用时的区别

举例说明:
当Optional有值时:

public class OptionalTest {
    public static void main(String[] args) {
        List 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 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()的区别)