zl程序教程

您现在的位置是:首页 >  其它

当前栏目

聊一聊 java8 中的 Optional

java8 optional 聊一聊
2023-09-11 14:14:53 时间

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("");
  }