Optional的用法属于函数式变成的范畴。它是把双刃剑,有时能极大的简化代码,但是有时也会降低代码的可读性,所以要视情况使用,最好不要用太复杂
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测
Optional 类的引入很好的解决空指针异常。
https://www.runoob.com/java/java8-optional-class.html
http://www.ibloger.net/article/3209.html
示例1 防止NPE或去除冗余null判断,注意map的用法
以前写法
public String getCity(User user) throws Exception{
if(user!=null){
if(user.getAddress()!=null){
Address address = user.getAddress();
if(address.getCity()!=null){
return address.getCity();
}
}
}
throw new Excpetion("取值错误");
}
java8写法
public String getCity(User user) throws Exception{
return Optional.ofNullable(user)
.map(u-> u.getAddress())
.map(a->a.getCity())
.orElseThrow(()->new Exception("取指错误"));
}
注意map的写法
可直接多层map,最后再orElse
示例1.1 - 直接return 到外层方法的例子
public static boolean isRankCity(String topListType) {
return Optional.ofNullable(TopListEnum.getEnumByCode(topListType))
.map(t -> t.isCityRank())
.orElse(false);
}
示例1.3 当源对象为list时的写法
Optional.ofNullable(abstractMonitorObjs)
.orElse(ImmutableList.of())
.stream()
.xxxx
示例二
比如,在主程序中
以前写法
if(user!=null){
dosomething(user);
}
java8写法
Optional.ofNullable(user).ifPresent( u -> {
dosomething(u);
}
String s = xx != ? : defaultString的替代
public class OptionalTest {
public static void main(String[] args) {
String input = null;
String timeZoneTag = Optional.ofNullable(input).orElse(TimeZoneTag.CTT);
// 以下写法也OK
//String timeZoneTag = Optional.ofNullable(input).orElseGet(() -> getDefault());
System.out.println(timeZoneTag);
}
public static String getDefault() {
return TimeZoneTag.CTT;
}
}
示例四:对可空的一个集合进行遍历
if(!CollectionUtils.isEmpty(list)) {
list.stream().foreach(r -> {
});
}
改为以下写法
Optional.ofNullable(list).orElse(ImmutableList.of()).stream().......