1 Optional 的简介

Optional 类位于 java.util包下,保存类型为 T 的值包括(null),其isPresent()方法调用时,如果值存在会返回true,调用其 get()方法会返回该值。

Optional 的作用 :Optional 类的引入主要是为了解决空指针异常(NullPointerException)。

2 Optional 的构造方法

创建 Optional 实例的方式有三种,分别是of、empty、ofNullable 三个静态方法。

2.1 Optional.of(T)

该方式的入参不能为null,否则会有NPE,在确定入参不为空时使用该方式。

2.2 Optional.ofNullable(T)

该方式的入参可以为null,当入参不确定为非null时使用。

2.3 Optional.empty()

这种方式是返回一个空Optional,等效Optional.ofNullable(null)

3 正确使用方式

例如有一个 UserBean

public class UserBean  implements Serializable {private int id;private String userName;private int age;...}

我们在使用UserBean实例对象来获取如userName这样的属性时,我们需要对其进行非空判断

  private String getUser(UserBean userBean) {if (userBean != null) {String userName = userBean.getUserName();return userName;}return "";}

使用 Optional 来实现上述的操作如下:

 private String getUser(UserBean userBean) {/*** 如果ofNullable参数传入 null,结果与 empty() 方法一致*/Optional<UserBean> optional = Optional.ofNullable(userBean);
​if (optional.isPresent()) {UserBean userBean1 = optional.get();String userName = userBean1.getUserName();return userName;}return "";}

这两种方式没有区别,甚至后续使用到的Optional反而增加了量,所以避免使用Optional.isPresent()来检查实例是否存在,因为这种方式和null != obj没有区别,这样用就没什么意义了。

当不建议使用 isPresent方法时,所避免使用Optional.get()方式来获取实例对象,因为使用前需要使用Optional.isPresent()来检查实例是否存在,否则也会出现空指针异常。

所以我们可以把上述代码替换成如下实现:

  private String getUser(UserBean userBean) {​Optional<UserBean> optional = Optional.ofNullable(userBean);
​return optional.map(UserBean::getUserName).orElse("");}
​

你可能还觉得使用Optional还是多此一举,我们接着来看

public class CarBean implements Serializable {​private int id;private String carName;private String carCode;
}
public class UserBean  implements Serializable {​private int id;private String userName;private CarBean carBean;
}

然后你要获取用户的 CarBean信息,会有如下代码​:

  private String getUserCar(UserBean userBean) {if (userBean != null) {CarBean carBean = userBean.getCarBean();if (carBean != null) {String carName = carBean.getCarName();if (carName != null) {return carName;}}}return "";}

当你使用 Optional 来操作时,​如下实现:

  private String getUserCar(UserBean userBean) {​Optional<UserBean> optional = Optional.ofNullable(userBean);//map是可能无限级联的return optional.map(UserBean::getCarBean).map(CarBean::getCarName).orElse("");}

聊一聊 java8 中的 Optional相关推荐

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

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

  2. Java8 中的 Optional

    从 Java 8 引入的一个很有趣的特性是 Optional  类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...

  3. 使用Java8中的Optional类来消除代码中的null检查

      作者:一书生VOID lw900925.github.io/java/java8-optional.html Optional类是Java 8新增的一个类,用以解决程序中常见的NullPointe ...

  4. java8中的Collectors.groupingBy用法

    Collectors.groupingBy根据一个或多个属性对集合中的项目进行分组 数据准备: public Product(Long id, Integer num, BigDecimal pric ...

  5. java8中 Collectors.groupingBy用法

    目录 1.数据准备: 2.分组 按照类目分组: 按照几个属性拼接分组: 根据不同条件分组 3.多级分组 4.按子组收集数据 求总数 求和 把收集器的结果转换为另一种类型 联合其他收集器 Collect ...

  6. 聊一聊Java8 Optional,让你的代码更加优雅

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  7. java中npe问题,JAVA8如何用Optional解决NPE问题详解

    引言 NPE(NullPointerException)是调试程序最常见的异常.google一下有很多关于方法到底应该返回null还是new一个空对象的讨论. 在文章的开头,先说下NPE问题,NPE问 ...

  8. Java8中Optional的基础使用和实践

    说明 首先我们来看一下Optional的作者 Brian Goetz 对这个 API 的说明: Our intention was to provide a limited mechanism for ...

  9. 深入JDK中的Optional

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

最新文章

  1. 四、创建第一个springboot项目
  2. c语言编译时字符黑色,C语言黑与白问题
  3. java 找不到工程文件_类加载器找不到文件求帮助
  4. 对话框Flags的设置值
  5. eclipse egit 报错 The current branch is not configured for pull No value for key branch.master
  6. mongoDB连接配置
  7. 【Python】异常捕获
  8. miller_rabin 证明与实现
  9. 浅谈JavaScript中闭包
  10. git clone远程仓库时,输错密码如何解决?
  11. 《Python Cookbook 3rd》笔记(4.13):创建数据处理管道
  12. 顺子(51Nod-2510)
  13. magento产品批量导出导入
  14. python的变量在使用前不需要先赋值_在赋值Python之前引用的另一个局部变量
  15. a标签无跳转的死链接
  16. 折半查找的平均查找次数分析
  17. WCF学习之旅(一)---Hello World.
  18. iOS 极光推送:This application or a bundle it contains has the same bundle identifier as this applicatio
  19. 编译链接错误:对‘vtable for xxxx’未定义的引用
  20. Oracle Database Link基础

热门文章

  1. 别再谈Python2与Python3区别, 反正我一个按钮随意转换代码!
  2. 这些Python代码技巧,你肯定还不知道
  3. CVPR2021 最具创造力的那些工作成果!
  4. PyTorch | torch.linspace()创建均分数列张量 | torch.linspace()如何使用?| torch.linspace()使用方法 | torch.linspace例子
  5. python企业级框架_Python六大开源框架对比:Web2py略胜一筹(转)
  6. RECT JS 由浅入深
  7. php 获取mysql大小限制_php计算整个mysql数据库大小的方法
  8. 万分之二用百分之怎么表示_红木家具怎么辨别真假
  9. 网络规划设计师复习笔记
  10. 联想微型计算机电脑黑屏怎么做系统,联想电脑黑屏怎么办 5种方法轻松排除黑屏故障...