什么是Optional类

NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方。NPE常是导致Java应用程序失败的最常见的原因。在日常研发工作中,经常会处理各种变量、集合,但在使用的过程中,往往要进行空判断,不然会出现NPE。

Optional类实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional 类的引入很好的解决空指针异常。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。尽量避免在程序中直接调用Optional对象的get()和isPresent()方法,避免使用Optional类型声明实体类的属性。

  • Optional.of(T t) : 创建一个 Optional 实例
  • Optional.empty() : 创建一个空的 Optional 实例
  • Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
  • isPresent() : 判断是否包含值 
  • orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
  • orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
  • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
  • flatMap(Function mapper):与 map 类似,要求返回值必须是Optional

如何使用Optional类

下面代码在两个常用场景,对比使用Optional类后的代码,可以看出,代码简洁很多。

第一个场景:判断是否为空

package com.java.bitmap;import java.util.Optional;public class OptionalDemo {public static void main(String[] args) {String name="kerry";// common wayif (name!=null&&name.length()!=0){System.out.println(name.length());}//use optional waySystem.out.println(Optional.ofNullable(name).orElse("").length());}
}

第二个场景:遍历list对象

 public static void listIterator(List<Integer> list){// common wayif (list!=null&&list.size()!=0){for (Integer tmp:list) {System.out.println(tmp);}}//use optional wayOptional.ofNullable(list).orElse(new ArrayList<>()).forEach(tmp->{System.out.println(tmp);});}

第三个场景:

public User getUser(User user) throws Exception{if(user!=null){String name = user.getName();if("zhangsan".equals(name)){return user;}}else{user = new User();user.setName("zhangsan");return user;}return null;
}
public User getUser(User user) {return Optional.ofNullable(user).filter(u->"zhangsan".equals(u.getName())).orElseGet(()-> {User user1 = new User();user1.setName("zhangsan");return user1;});
}

orElseGet和orElse相似,都可以自定义类型返回,前者支持lamaba表达式。

JDK 8 的optional类相关推荐

  1. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)

    目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行   Stream的.max方 ...

  2. java8中新判空方法之Optional类的使用

    Optional来简化代码同时高效处理NPE(Null Pointer Exception 空指针异常) 认识Optional Opitonal类就是Java提供的为了解决大家平时判断对象是否为空用, ...

  3. 京东云开发者|深入JDK中的Optional

    概述:Optional最早是Google公司Guava中的概念,代表的是可选值.Optional类从Java8版本开始加入豪华套餐,主要为了解决程序中的NPE问题,从而使得更少的显式判空,防止代码污染 ...

  4. jdk1.8——Optional类

    Optional类可以更友好的处理null问题,将if(xxx == null)等类似代码变得更简洁: Optional类包含的内容:(jdk1.8) 构造Optional类: Optional类构造 ...

  5. Java Optional类源码解析和用法

    个人网站:http://xiaocaoshare.com/ 要求:jdk1.8以上 Optional类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get( ...

  6. 如何正确的使用Java8中的Optional类来消除代码中的null检查

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:一书生VOID lw900925.github.io/jav ...

  7. 深入JDK中的Optional

    概述:Optional最早是Google公司Guava中的概念,代表的是可选值.Optional类从Java8版本开始加入豪华套餐,主要为了解决程序中的NPE问题,从而使得更少的显式判空,防止代码污染 ...

  8. java int类源码,一起学JDK源码 -- Integer类

    Integer类为java基本类型int的包装类,除了前面提到的Byte类,Short类中的大部分方法,Integer类中还提供了很多处理int类型的方法,接下来就让我们一起看看吧. 基础知识: 1. ...

  9. Java 8 Optional 类

    Java 8 Optional 类  Java 8 新特性 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. ...

最新文章

  1. ACE Lock类介绍
  2. 递归神经网络预测股票好文章
  3. java时间间隔的判断
  4. 再论SAP云平台上CloudFoundry编程环境的connectivity
  5. Linux下配置简单的图形桌面环境
  6. VueJs入门(一)
  7. HTML/CSS 练习
  8. Mycat实战之配置EP分片
  9. 神州数码c语言笔试题,神州数码应聘笔试题(2)
  10. 【持续更新】Eclipse使用教程
  11. 浪曦视频--工厂方法模式
  12. ENVI 工具箱汉翻译汉化
  13. docker容器必须要有前台进程
  14. Flash:动画实例--球体弹跳
  15. php tsrmg,php内核分析(二)-ZTS和zend_try
  16. 微信公众号代运营的的技巧有哪些(6)
  17. 频繁出现域名无法解析该如何处理
  18. AVR单片机网址推荐 .
  19. 在IPhone上添加邮箱(163示例)
  20. 【历史上的今天】8月19日:大型计算机先驱和小型机之父诞生;中国雅虎邮箱成历史

热门文章

  1. 鸿联九五26周年,追梦不止,犇赴未来
  2. r语言rank降序_R语言学习笔记:sort、rank、order、arrange排序函数
  3. 校园导航系统java具有gui,[数据结构大作业]HBU Guide 河北大学校园导航
  4. virsh undefine 报错处理
  5. ER图学习笔记(附各个图型的举例,实战案例)
  6. 介绍一个优秀的单片机图形库,GuiLite
  7. linux64 汇编 signal,signal问题,SIGTERM被忽略?
  8. 20170518关于zabbix监控路由器交换机
  9. 电脑版终于来了:不限速,支持单个30G大文件上传
  10. 批处理Bat教程-第八章:番外篇