在代码中的很多地方进行非空判断,尤其是在对象调用方法中,如下:
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的工厂方法,区别在与of(Object)
参数不能为空,会抛出NullPointException异常,而ofNullable(Object)
没有限制。
Optional<Object> opt = Optional.of(Object); //参数不能为null
Optional<Object> opt = Optional.ofNullable(Object); //任意参数
boolean isNull = optional.isPresent();//判断值是否为空
opt.ifPresent(Consumer consumer);//如果option对象保存值不是null,则调用consumer对象,否则不调用
opt.orElse(value);//如果optional对象保存的值不是null,则返回原来的值,否则返回value
opt.orElseGet(Supplier supplier);//功能与orElse一样,只不过orElseGet参数是一个对象
opt.filter(Predicate);//判断Optional对象中保存的值是否满足Predicate,并返回新的Optional。
opt.map(Function):对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)
flatMap():功能与map()相似,差别在于map方法的mapping函数返回值可以是任何类型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,按照传统写法应该进行多次判断规避空指针异常:
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();
网友评论