orElse
和orElseGet
作为Optional类的两个常用方法,都表示当Optional对象里面的值为空的时候,返回一个默认的值。
按照常理,既然将它们写为两个不同的方法,其中就一定有些差别。
首先我们看一下这两个方法的具体描述:
- orElse
T orElse(T other)
如果存在该值,返回值, 否则返回 other
。
- orElseGet
T orElseGet(Supplier<? extends T> other)
如果存在该值,返回值, 否则触发 other
,并返回 other
调用的结果。
区别
可以注意到,二者的描述主要有两点不同:
-
orElse
方法的传入参数为为一个某类型(泛型)的值,而orElseGet
方法接受的传入方法为一个Supplier。Supplier我们在函数式接口一节学习过,它是一个没有输入参数的函数式接口。 -
orElseGet
方法的描述里我加粗了触发二字,注意到它是在optional的值为空时才触发。
看下面一个例子:
import java.util.Optional;
public class OptionalTest {
public static void main(String[] args) {
Integer value1 = null;
Integer value2 = 10;
Optional<Integer> a = Optional.ofNullable(value1);
Optional<Integer> b = Optional.of(value2);
System.out.println(b.orElse(getDefaultValue())); // 调用getDefaultValue
System.out.println(a.orElse(getDefaultValue())); // 调用getDefaultValue
System.out.println(b.orElseGet(() -> getDefaultValue())); // 不调用getDefaultValue
System.out.println(a.orElseGet(() -> getDefaultValue())); // 调用getDefaultValue
}
public static Integer getDefaultValue() {
return new Integer(0);
}
}
对于上面这个例子,首先,我们可以看出orElse
和orElseGet
的传入参数不同。
其次,对于orElse
方法,无论Optional的值是否为空,它都会去获得传入的值,在上例中也就是说,始终会调用getDefaultValue
;而orElseGet
方法则只有在Optional的值为空时才去触发传入的Supplier,我们上例的getDefaultValue
也在此时才会被调用。从这一点不同,我们可以感觉到,orElseGet
方法要优于orElse
方法。
网友评论