1、真实案例
分页插件报错The jdbcUrl is Null, Cannot read database type #2172
2、区别
orElse(T default),如果Optional的值为null,返回default默认值。如果不为null,返回Optional的值。
orElseGet(Supplier<? extends T> other),传递过来的是一个函数。如果Optional的值为null,返回函数的值。如果不为null,返回Optional的值。
初步来看,好像确实一样。
区别:
orElse(T default)无论Optional的值是否为null,都会计算default的值。
orElseGet(Supplier<? extends T> other),只有当Optional的值为null时,才会去计算函数表达式的值,类似于懒加载,功能上相当于短路。
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()会导致NPE,而getName2()不会。