在代碼中的很多地方進行非空判斷署恍,尤其是在對象調(diào)用方法中信认,如下:
Object obj = function();
if(obj != null){
List<String> list = obj.getInnerList();
if(list != null){
String s = list.get(1);
if(s != null && StringUtils.isNotBlank(s)){
.....
}
}
}
判斷相當繁瑣罪郊,而且代碼不美觀
在JDK8中新增了Optional類益愈,Optional是個容器:它可以保存類型T的值,或者僅僅保存null饼灿。Optional提供很多有用的方法幕侠,這樣就不用顯式進行空值檢測。
of()
和ofNullable()
是Optional的工廠方法碍彭,區(qū)別在與of(Object)
參數(shù)不能為空晤硕,會拋出NullPointException異常,而ofNullable(Object)
沒有限制庇忌。
Optional<Object> opt = Optional.of(Object); //參數(shù)不能為null
Optional<Object> opt = Optional.ofNullable(Object); //任意參數(shù)
boolean isNull = optional.isPresent();//判斷值是否為空
opt.ifPresent(Consumer consumer);//如果option對象保存值不是null,則調(diào)用consumer對象,否則不調(diào)用
opt.orElse(value);//如果optional對象保存的值不是null舞箍,則返回原來的值,否則返回value
opt.orElseGet(Supplier supplier);//功能與orElse一樣皆疹,只不過orElseGet參數(shù)是一個對象
opt.filter(Predicate);//判斷Optional對象中保存的值是否滿足Predicate疏橄,并返回新的Optional。
opt.map(Function):對Optional中保存的值進行函數(shù)運算略就,并返回新的Optional(可以是任何類型)
flatMap():功能與map()相似,差別在于map方法的mapping函數(shù)返回值可以是任何類型T,而flatMap方法必須是Optional捎迫。
Demo
class Country{
City city;
City getCity(){
return city;
}
...
}
class City{
Town town;
City getTown (){
return town;
}
...
}
class Town {
String townName = "new york";
City getName (){
return townName ;
}
...
}
如果要獲取townName,按照傳統(tǒng)寫法應(yīng)該進行多次判斷規(guī)避空指針異常:
Country country = new Country();
if(country != null && country.getCity() != null && country.getCity().getTown != null){
System.out.println(country.getCity().getTown.getName());
}
如果用Optional就可以擺脫這些null檢查
Optional.of(new Country ())
.map(Country ::getCity)
.map(City::getTown)
.map(Town::getName)
.ifPresent(System.out::println);
如果有空指針情況,異常將會被捕獲表牢,并返回Optional.empty();