orElse
和orElseGet
作為Optional類的兩個常用方法,都表示當Optional對象里面的值為空的時候,返回一個默認的值。
按照常理葱弟,既然將它們寫為兩個不同的方法,其中就一定有些差別猜丹。
首先我們看一下這兩個方法的具體描述:
- orElse
T orElse(T other)
如果存在該值翘悉,返回值, 否則返回 other
居触。
- orElseGet
T orElseGet(Supplier<? extends T> other)
如果存在該值妖混,返回值老赤, 否則觸發(fā) other
,并返回 other
調(diào)用的結(jié)果制市。
區(qū)別
可以注意到抬旺,二者的描述主要有兩點不同:
-
orElse
方法的傳入?yún)?shù)為為一個某類型(泛型)的值,而orElseGet
方法接受的傳入方法為一個Supplier祥楣。Supplier我們在函數(shù)式接口一節(jié)學習過开财,它是一個沒有輸入?yún)?shù)的函數(shù)式接口。 -
orElseGet
方法的描述里我加粗了觸發(fā)二字误褪,注意到它是在optional的值為空時才觸發(fā)责鳍。
看下面一個例子:
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())); // 調(diào)用getDefaultValue
System.out.println(a.orElse(getDefaultValue())); // 調(diào)用getDefaultValue
System.out.println(b.orElseGet(() -> getDefaultValue())); // 不調(diào)用getDefaultValue
System.out.println(a.orElseGet(() -> getDefaultValue())); // 調(diào)用getDefaultValue
}
public static Integer getDefaultValue() {
return new Integer(0);
}
}
對于上面這個例子,首先兽间,我們可以看出orElse
和orElseGet
的傳入?yún)?shù)不同历葛。
其次,對于orElse
方法嘀略,無論Optional的值是否為空辽剧,它都會去獲得傳入的值呐萨,在上例中也就是說最域,始終會調(diào)用getDefaultValue
洋腮;而orElseGet
方法則只有在Optional的值為空時才去觸發(fā)傳入的Supplier,我們上例的getDefaultValue
也在此時才會被調(diào)用讼育。從這一點不同帐姻,我們可以感覺到,orElseGet
方法要優(yōu)于orElse
方法奶段。