还在防御式的调用别人的接口吗?
还在为多层嵌套对象而烦恼吗?
拥抱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开始。

欢迎关注《侠梦的开发笔记》,一起学习进步
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐