老早以前就听说过Optional可以解决开发过程中的空指针异常,中途看过几篇博客,但一直没有下手的勇气。5月底公司有个新项目开展,技术栈更新了许多,再加上看见新公司同事用到了JDK8的stream流操作集合,心里也痒痒,就拿Optional来开刀了。中途也遇到了几个小小的坑,记录下来仅供参考。
主要参考这位大佬的博客:【原创】JAVA8之妙用Optional解决NPE问题
原先输出省市区的区域名称的写法:
//获取省市区的区域
if (province != null) {
City city = province.getCity();
if (city != null) {
Area area = city.getArea();
if (area != null) {
System.out.println(area.getName());
}
}
}
1.不会用瞎用Optional
以为包装个Optional就万事大吉,于是我有了下面的写法:
Province province = null;
System.out.println(Optional.ofNullable(province.getCity().getArea().getName()));
空指针异常......尴尬......
2.不会用乱用Optional导致实体类要改变
参照网上一篇博客给的用法:实体类中的属性全部加上Optional<..>修饰:
//实体类定义
public class Province {
private Optional<City> city;
}
public class City {
private Optional<Area> area;
}
public class Area {
private Optional<String> name;
}
//方法输出....
System.out.println(Optional.ofNullable(province)
.flatMap(p -> p.getCity())
.flatMap(c -> c.getArea())
.flatMap(a -> a.getName()));
这样的虽然把区域名称打印出来了,但也改变了实体类属性的修饰,导致转json字段为空,数据库类型不匹配.....等等一系列问题,放弃了......
3.正确写法
还是参考了上面大佬的博客,最终写法:
System.out.println(Optional.ofNullable(province)
.map(p -> p.getCity())
.map(c -> c.getArea())
.map(a -> a.getName()));
//更精简
System.out.println(Optional.ofNullable(province)
.map(Province::getCity)
.map(City::getArea)
.map(Area::getName));
这里只讲了Optional使用的一些坑,还有其他用法,网上一堆,我就不列了。
一开始学习optional,lambda,stream总以为是洪水猛兽,不敢用。但这两个月项目用下来,感觉还是:得先迈出那一步,才知道,so easy 啦~
完~