教你怎么使用Optional处理null
一、聊聊NullPointerException
相比做Java开发的,见到NullPointerException
肯定不陌生吧,可以说见到它深恶痛绝。在开发时认为不会出现NullPointerException
异常,最终到了生产环境,就给你来点意外惊喜。但是在开发时处理对象为空的通常都是用if(null != xxx)
,或者使用一些工具类,比如:if(ObjectUtils.isEmpty(xxx))
,可以看出这种处理会让我们的代码变得很臃肿,遇到一个对象时可能都要这样来一下。
使用Optional
类就可以避免在程序中使用一堆的if
来处理空了。下表列出Optional
类中的方法:
方法名 | 描述 |
empty | 返回一个空的Optional 实例 |
of | 将指定值用Optional 封装后返回,如果值为null ,则抛出NullPointerException 异常 |
ofNullable | 将指定值用Optional 封装后返回,如果值为null ,则返回空的Optional 对象 |
get | 如果值存在,则返回该值,否则抛出NullPointerException 异常 |
isPresent | 检查值是否存在,存在返回true ,否则返回false |
ifPresent | 如果值存在,就执行使用该值的方法调用,否则什么都不做 |
filter | 如果值存在并且满足提供的谓词,就返回包含该值的Optional 对象,否则返回空的Optional 对象 |
map | 如果值存在,就对该值执行提供的mapping 函数调用 |
flatMap | 如果值存在,就对该值执行提供的mapping 函数调用,返回一个Optional 类型的值,否则就返回一个空的Optional 对象 |
orElse | 如果值存在就将其返回,否则返回指定的的值 |
orElseGet | 如果值存在就将其返回,否则返回由指定的Supplier 接口生成的值 |
orElseThrow | 如果值存在就将其返回,否则抛出由指定的Supplier 接口生成的异常 |
下面就一一来详细使用上面列出的方法。
二、使用Optional类
2.1 empty
Optional<User> user = Optional.empty();
创建一个空的Optional
对象
2.2 of
User user = null; Optional<User> optional = Optional.of(user);
user
为空,直接报NullPointerException
异常,因此该方法一般很少用。
2.3 ofNullable
User user = null; Optional<User> optional = Optional.ofNullable(user);
user
为空,则返回空的Optional
对象
2.4 get
User user = null; Optional<User> optional = Optional.ofNullable(user); optional.get();
从Optional
中获取值,如果值不存在则抛出如下异常:java.util.NoSuchElementException: No value present
2.5 isPresent
User user = null; Optional<User> optional = Optional.ofNullable(user); optional.isPresent();
以上例子返回false
,如果user
不为空,则返回true
2.6 ifPresent
User user = null; Optional<User> optional = Optional.ofNullable(user); optional.ifPresent(us->{ //user不为空,执行 });
2.7 filter
User user = new User(); user.setName("小A"); boolean result = Optional.ofNullable(user).filter(us -> "小A".equals(us.getName())).isPresent();
如果用户名为小A
,则返回true
,否则返回false
2.8 map
User user = new User(); user.setName("小A"); String name = Optional.ofNullable(user).map(User::getName).get();
如果user
不为空,则抽取name
属性,使用get()
获取。这里如果name
为空,则会报异常,因此通常都是指定默认值或使用自定义异常抛出。
String name = Optional.ofNullable(user).map(User::getName).orElse("");
或
String name = Optional.ofNullable(user) .map(User::getName) .orElseThrow(()->new RuntimeException("用户名不能为空"));
2.9 flatMap
该方法一般用于从类中获取其他类的中某个属性,比如一个班级里面有学生,学生里面有地址,现在需要获取这个班级下的某个学生的地址,按之前的写法:
Address address = new Address(); address.setAddr("天河区"); Student student = new Student(); student.setName("小A"); student.setAddress(address); Grade grade = new Grade(); grade.setName("三年级2班"); grade.setStudent(student); if(!ObjectUtils.isEmpty(grade)){ Student student1 = grade.getStudent(); if(!ObjectUtils.isEmpty(student1)){ Address address1 = student1.getAddress(); if(!ObjectUtils.isEmpty(address1)){ System.out.println(address1.getAddr()); } } }
为了程序不出问题,就会写一大堆的if
来判断,下面用flatMap
来看下怎么实现:
Optional.ofNullable(grade) .flatMap(g->Optional.ofNullable(g.getStudent())) .flatMap(s->Optional.ofNullable(s.getAddress())) .map(Address::getAddr) .orElse("")
或
Optional.ofNullable(grade) .map(Grade::getStudent) .map(Student::getAddress) .map(Address::getAddr) .orElse("")
2.10 orElse
Optional.ofNullable(grade).orElse(new Grade());
2.11 orElseGet
Optional.ofNullable(grade).orElseGet(()->new Grade());
2.12 orElseThrow
Optional.ofNullable(grade).orElseThrow(()->new RuntimeException("班级不能为空"));
以上Optional
类的全部方法的使用都列出来了。
到此这篇关于教你怎么使用Optional处理null的文章就介绍到这了,更多相关Optional处理null内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
关于JDK15的新特性之TextBlocks文本块的引入和使用
这篇文章主要介绍了关于JDK15的新特性之文本块的引入和使用,如果具有一种语言学机制,可以比多行文字更直观地表示字符串,而且可以跨越多行,而且不会出现转义的视觉混乱,那么这将提高广泛Java类程序的可读性和可写性,需要的朋友可以参考下2023-07-07SpringBoot基于Mybatis拦截器和JSqlParser实现数据隔离
本文将介绍如何在 Spring Boot 项目中利用Mybatis的强大拦截器机制结合JSqlParser,一个功能丰富的 SQL 解析器,来轻松实现数据隔离的目标,本文根据示例展示如何根据当前的运行环境来实现数据隔离,需要的朋友可以参考下2024-04-04通过AOP拦截Spring Boot日志并将其存入数据库功能实现
本文介绍了如何使用Spring Boot和AOP技术实现拦截系统日志并保存到数据库中的功能,包括配置数据库连接、定义日志实体类、定义日志拦截器、使用AOP拦截日志并保存到数据库中等步骤,感兴趣的朋友一起看看吧2023-08-08SpringBoot3和ShardingSphere5框架实现数据分库分表
这篇文章主要介绍了SpringBoot3和ShardingSphere5框架实现数据分库分表的相关资料,需要的朋友可以参考下2023-08-08利用SpringMVC接收复杂对象和多个文件(前端使用JQuery)
这篇文章主要介绍了利用SpringMVC接收复杂对象和多个文件(前端使用JQuery),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-10-10
最新评论