1、真實(shí)案例
分頁插件報錯The jdbcUrl is Null, Cannot read database type #2172
2、區(qū)別
orElse(T default),如果Optional的值為null,返回default默認(rèn)值。如果不為null,返回Optional的值。
orElseGet(Supplier<? extends T> other),傳遞過來的是一個函數(shù)。如果Optional的值為null,返回函數(shù)的值。如果不為null,返回Optional的值。
初步來看,好像確實(shí)一樣。
區(qū)別:
orElse(T default)無論Optional的值是否為null,都會計算default的值。
orElseGet(Supplier<? extends T> other),只有當(dāng)Optional的值為null時,才會去計算函數(shù)表達(dá)式的值,類似于懶加載,功能上相當(dāng)于短路。
3、代碼理解
public class OptionalTest {
public static void main(String[] args) {
User user = new User();
user.setChineseName("張三");
String name1 = user.getName1();
System.out.println("name1 = " + name1);
//String name2 = user.getName2();
//System.out.println("name2 = " + name2);
}
}
class User {
private String chineseName;
private EnglishName englishName;
public String getChineseName() {
return chineseName;
}
public void setChineseName(String chineseName) {
this.chineseName = chineseName;
}
public EnglishName getEnglishName() {
return englishName;
}
public void setEnglishName(EnglishName englishName) {
this.englishName = englishName;
}
public String getName1() {
return Optional.ofNullable(chineseName).orElse(englishName.getFirstName());
}
public String getName2() {
return Optional.ofNullable(chineseName).orElseGet(()->englishName.getFirstName());
}
}
class EnglishName {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
getName1()會導(dǎo)致NPE,而getName2()不會。