聊一聊 java8 中的 Optional
Posted 早起的年轻人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聊一聊 java8 中的 Optional相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章