还在防御式的调用别人的接口吗?
还在为多层嵌套对象而烦恼吗?
拥抱java8的Optional吧!众所周知,Optional让很多小伙伴减少了很多NullPointerException,这里不再探讨其用法,而是分享一些我遇到的真实案例。
-
1)调用他人接口时,再也不用各种判断了
-
传统情况下,我们通过http工具或者使用微服务feign的方式调用其他接口,总是担心别人的接口返回各种奇怪的东西,甚至还有在字段上“缺斤少两”的情况。
-
先判断返回code是不是成功,然后判断数据存不存在,一来二去,写了很多冗余代码,java8 的Optional 如何优雅的处理上述情况呢?,请随侠梦娓娓道来。
-
-
我们期望的返回格式如下:
{
"code": "0000",
"msg": "调用成功!",
"data": []
}
模拟调用外部接口
Map<String, Object> map = serviceImpl.queryAlarmList(indexIds);
即使map为空也能正常返回,配合map直接映射数据值
return Optional.ofNullable(map).map(r -> r.get("data")).orElseGet(ArrayList::new);
- 2)使用Optional包装返回值
- 协作开发中,免不了重复造轮子,如果别人已经造过轮子了,何不拿来研究一番,采用Optional包装的返回值,让别人知道你的方法可能会返回空值,相当于声明一个注释,如果直接调用get()拿值,可能会空指针哦,
public Optional<People> buildPeople(){
//...各种逻辑
People people = null;
return Optional.ofNullable(people);
}
3)避免判断风暴
- 对象层层嵌套,为了逻辑严谨必须要进行空判断,如果不层层判断,有可能在某一层上收获一个空指针,而Optional优雅的帮我们处理掉这样的逻辑。
School school = null;
if(school != null){
Clazz clazz = school.getClazz();
if(clazz != null){
Student student = clazz.getStudent();
if(student != null){
String name = student.getName();
if(name == null || "".equals(name)){
name = "侠梦的开发笔记";
}
}
}
}
- 配合方法引用,优化后如下
String name = Optional.ofNullable(school)
.map(School::getClazz)
.map(Clazz::getStudent)
.map(Student::getName)
.orElse("侠梦的开发笔记");
4)对象增强
- 包装上Optional的对象,可以灵活的使用map(),filter()等方法进行增强,大大简化的我们的代码,案例如下:
People people = null;
Optional.ofNullable(people)
//...可以有无穷个中间操作
.filter(p->p.getName().startsWith("侠梦的开发笔记"))
.map(p->p.getMoney())
//终端操作,消费掉
.ifPresent(System.out::print);
以上就是Optional的一些案例,配合其api能更好的发挥出其作用,减少发生空指针,从Optional开始。