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().......
