這兩個(gè)方法表示當(dāng)Optional對(duì)象里面的值為空的時(shí)候绩衷,返回一個(gè)默認(rèn)的值声畏。這個(gè)方法極其相似,甚至在很多情況下可以相互替代娄帖,但是仍舊有一些不同也祠。
1. 傳入?yún)?shù)不同
public T orElse(T other)
public T orElseGet(Supplier<? extends T> other)
orElse()接受類型T的任何參數(shù),而orElseGet()接受類型為Supplier的函數(shù)接口近速,該接口返回類型為T的對(duì)象 诈嘿。
- orElse():如果有值則將其返回,否則返回指定的其它值削葱。
- orElseGet():如果有值則將其返回奖亚,否則調(diào)用函數(shù)并將其返回調(diào)用結(jié)果。
2. 使用時(shí)的區(qū)別
舉例說(shuō)明:
當(dāng)Optional有值時(shí):
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 + "執(zhí)行了方法");
return 1;
}
}
輸出結(jié)果:
a執(zhí)行了方法
a = 60
b = 60
當(dāng)Optional值為空時(shí):
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 + "執(zhí)行了方法");
return 1;
}
}
輸出結(jié)果:
a執(zhí)行了方法
b執(zhí)行了方法
a = 1
b = 1
由上可以發(fā)現(xiàn)析砸,orElse()方法在Optional值為非空時(shí)昔字,也會(huì)計(jì)算傳入的參數(shù),而orElseGet()方法只有在Optional值為空時(shí)才會(huì)執(zhí)行傳入的函數(shù)。
3. 性能上的區(qū)別
由于orElseGet()不是每次都會(huì)調(diào)用傳入的方法作郭,所以orElseGet()方法在性能上要優(yōu)于orElse()方法陨囊。
一般情況下,使用orElseGet()方法更好夹攒,除非默認(rèn)對(duì)象已經(jīng)定義好可以直接訪問(wèn)蜘醋。