动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

深入理解Optional类

05-28 17:24 751浏览
举报 T字号
  • 大字
  • 中字
  • 小字

Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。或者你直接叫做一个包装类,只包装了一个属性,这个属性的值可有可无。

  • 它是box类型,保持对另一个对象的引用
  • 是不可变的,不可序列化的
  • 没有公共构造函数
  • 只能是present 或absent
  • 通过of(), ofNullable(), empty() 静态方法创建

如图:

1.身为接口提供者

我有一个方法定义如下:

/**
	* 获取用户
	* @param id 唯一id
	* @return 用户 可能为null,代表不存在
	*/
public User getUser(Long id) {
	if (null != id) {
		return new User();
	}
	return null;
}

尽管我已经在方法注释中说明返回的User可能为空,可我依然不敢保证其他开发成员都会进行 if (user == null) 判断,当没有这一步时,那么接下来就是大家最常见的NullPointerException .

此时,调用者会不会内心:MD,不存在也不说一下!。

提供者:(捂脸)冤枉啊!你自己不看方法注释,还怪我……

你们说这个时候是不是该Optional上场了?

public Optional<User> getUser(Long id) {
	if (null != id) {
		return Optional.of(new User());
	}
	return Optional.empty();
}

你们看!现在我已经明确的告诉了调用者,我返回的用户对象是可能存在也可能不存在,你要注意两者的不同处理。

此时,我仅仅改变一个返回值,就能很大程度上帮助调用者避免NPE的问题。

2.身为调用者

提供者返回的类型为Optional,那么就是说返回的对象可能为null,那么我要分别判断存在和不存在该如何处理了,如下:

public void test(){
  Optional<User> userOp = getUser(110L);
  if (userOp.isPresent()){
    User user = userOp.get();
    // TODO 
  }else{
    // TODO 
  }
}
  • 如果我现在只想对不为空的情况处理:
userOp.isPresent(user -> log.info(user));
  • 如果现在我想获取用户住址中的国家:
userOp.map(User::getAddress)
  .map(Address::getCountry);
  • 如果用户不存在或地址不存在,我需要抛出异常
userOp.map(User::getAddress)
  .map(Address::getCountry)
  .orElseThrow(NotExistException::new);
  • 如果想要设置默认值:
userOp.map(User::getAddress)
  .map(Address::getCountry)
  .orElse("默认值");
  • 为什么使用map方法不会出现NPE呢?

因为map遇到不存在的值就会返回一个不含任何值的Optional对象,直到走到else方法,等待使用者的处理。

public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    if (!isPresent())
        return empty();
    else {
        return Optional.ofNullable(mapper.apply(value));
    }
}

经过上面的学习,我们已经大致地了解了 Optional 类的定义和用途,很多时候 Optional 类被用来解决空指针异常的问题,相关的案例我们可以参考动力节点在线提供的免费视频课程。

0人推荐
共同学习,写下你的评论
0条评论
杨晶珍
程序员杨晶珍

98篇文章贡献357785字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Spring常见面试题

代码小兵92504-17 16:07

Java零基础实战项目——五子棋

代码小兵98804-25 13:57

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

发评论

举报

0/150

取消