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

欢迎关注《侠梦的开发笔记》,一起学习进步

java8_我是如何优雅的使用Optional的相关推荐

  1. JDK8 Optional

    JDK8 Optional 我们经常会在代码里去判断对象是否为null,以避免NPE的问题.JDK8提供了Optional类配合函数编程和流式编程去更加优雅的处理Optional. 一.API Opt ...

  2. linux怎么进入root文件,linux下安装ROOT过程

    说明: 这是我安装ROOT的过程,仅供参考,如果有哪个地方没说清楚或者有错误,非常希望能告诉我.如果想对ROOT安装有详尽的了解,可以参考官网的说明. 我的linux发行版为Ubuntu14.04,R ...

  3. 编程实现路由算法_TCP/IP 之路由算法

    (给算法爱好者加星标,修炼编程内功) 作者:六尺帐篷 www.jianshu.com/p/e5cce2958790 网络层的重要功能就是路由和转发.而路由是根据路由器根据所维护的路由表进行路由选择.所 ...

  4. 怎么快速制作web原型_如何使用AppGini快速原型制作Web应用程序

    怎么快速制作web原型 This article was sponsored by AppGini. Thank you for supporting the partners who make Si ...

  5. 用C# GDI 绘制一张精美的分享二维码图片

    C# 用GDI 绘制一张精美的分享二维码图片 简单干脆,直接上代码 下面附带上面用到的一些方法 最后附带 最终生成效果 简单干脆,直接上代码 var key = "http://www.xx ...

  6. 强烈推荐这个优秀的技术公众号!!

    大家好,我是帅地,写文章有一年了,这一年里写了150多篇原创文章,主要写「数据结构与算法」,「计算机基础」:包括数据库,计算机网络,Linux等.这这些计算机基础知识(数据结构与算法+计算机网络+操作 ...

  7. java 开发技术总结

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IO部分的故事 1.java 將一個本地的文件讀取到内存BYTE數組裏面 https://blog.csdn.net ...

  8. 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7

    https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...

  9. 为什么我购买了 iCloud 额外的 50g 存储空间?

    很奇怪的标题 这篇文章打算倒叙,先讲讲我是怎么优雅地使用 iCloud 服务的吧. iCloud 是什么? 很简单咯,就像 Google 的 Google Drive,微软的 OneDrive,甚至说 ...

最新文章

  1. 人工智能浪潮褪去,冲刺IPO成AI企业生存关键?
  2. 【勉强采用】反欺诈之血缘关系分析和犯罪传导监测
  3. mysql semi join_MySQL 5.6 Semi join优化之materialization strategy
  4. 201771010102 常惠琢《面向对象程序设计(java)》第八周学习总结
  5. 贪心策略摘果子(洛谷P1478题题解,Java语言描述)
  6. 【Java】面向对象是什么
  7. java登陆拦截器_SpringBoot拦截器实现登录拦截
  8. Hidden (NOIP模拟赛)(字符串模拟QAQ)
  9. 每日算法系列【LeetCode 503】下一个更大元素 II
  10. 前阿里P10员工赵海平加入字节跳动,职级或为4+
  11. 网页设计中的色彩搭配技巧
  12. 读书、生活经典语录随笔
  13. python房价分析论文_用Python研究了三千套房子,告诉你究竟是什么抬高了房价?...
  14. Abaqus idle 3600 seconds 或 Process terminated by external request 问题解决
  15. 基于docker安装的rabbitmq如何安装rabbitmq_delayed_message_exchange-3.8.0.ez插件
  16. 火狐同步safari书签_如何将Safari浏览器的Chrome,Firefox和Internet Explorer书签同步
  17. Healthcare Cloud on Windows Azure (0) 开篇
  18. Windows驱动开发书籍简介
  19. python 模拟鼠标点击桌面指定位置
  20. 哈工大深圳计算机水平怎么样,还原一个真实的哈工大!——十问(转载)

热门文章

  1. win10中Charles从下载安装到证书设置和雷电模拟器或浏览器中抓包测试
  2. _ETHREAD断链 —— 实现线程隐藏
  3. springboot项目在外部tomcat运行出现的问题
  4. 学习UI设计需要具备什么条件
  5. 设置浏览器显示小于12px以下字体的三种方法
  6. 强化学习基础05——gym
  7. java学习之路2--简单工厂模式实现饮料自动贩卖机
  8. A/C加权的matlab实现
  9. mysql提权软件后门_Mysql提权留后门
  10. 安装mysql 遇到问题