使用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的更多相关文章
- JDK8新特性:使用Optional避免null导致的NullPointerException
空指针异常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写 ...
- Java8之使用Optional进行Null处理
Optional类这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题,本篇文章将详细介绍Optional类,以及如何用它消除代码中的null检查. 1. ...
- 用optional取代null
Java8引入了java.util.Optional<T>,它是一个封装的Optional值的类.变量存在时,Optional类只是对类简单封装.变量不存在时,缺失的值会被建模成一个空的O ...
- Java8:使用 Optional 处理 null
写过 Java 程序的同学,一般都遇到过 NullPointerException :) —— 为了不抛出这个异常,我们便会写如下的代码: User user = getUserById(id); i ...
- Java 8 (9) Optional取代null
NullPointerException,大家应该都见过.这是Tony Hoare在设计ALGOL W语言时提出的null引用的想法,他的设计初衷是想通过编译器的自动检测机制,确保所有使用引用的地方都 ...
- 《Java 8 in Action》Chapter 10:用Optional取代null
1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法.ALGOL W是第一批在堆上分配记录的类型语言之一.Hoare选择null引用这种方式,& ...
- java8 用Optional取代null
如何处理null 怎样做才能避免不期而至的NullPointerException呢?通常,可以在需要的地方添加null的检查(过于激进的防御式检查甚至会在不太需要的地方添加检测代码),并且添加的方式 ...
- Guava学习笔记(1):Optional优雅的使用null
转自:http://www.cnblogs.com/peida/archive/2013/06/14/Guava_Optional.html 参考:[Google Guava] 1.1-使用和避免nu ...
- Optional优雅的使用null
在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ...
随机推荐
- 【linux】驱动-4-LED芯片手册分析
目录 前言 4. LED芯片手册分析 4.1 内存管理单元MMU 4.1.1 MMU的功能 4.1.2 TLB的作用 4.2 地址转换函数 4.2.1 ioremap函数 4.2.2 iounmap函 ...
- Java例题_48 四位数据加密
1 /*48 [程序 48 加密] 2 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的, 3 加密 规则如下: 4 每位数字都加上 5,然后用和除以 10 的余数代替该数字 ...
- Android学习中出现的问题
•问题1:多行文字如何实现跑马灯效果? 博客链接:Androidd Studio 之多行文字跑马灯特效 解决状态:已解决 •问题2:cause: unable to find valid certif ...
- teprunner测试平台Django引入pytest完整源码
本文开发内容 pytest登场!本文将在Django中引入pytest,原理是先执行tep startproject命令创建pytest项目文件,然后从数据库中拉取代码写入文件,最后调用pytest命 ...
- Flex属性你真的搞清楚了吗?我深表怀疑
背景 在使用弹性布局实现两侧宽度固定,中间宽度自适应的效果时,发现自己理解的和实际效果不一致,所以亲自实践验证了一个flex属性的诸多场景的表现,不仅解开了我之前使用过程遇到的疑惑,而且发现了许多自己 ...
- OO_Unit4_Summary暨课程总结
初始oo,有被往届传言给吓到:oo进行中,也的确有时会被作业困扰(debug到差点放弃):而oo即将结束的此刻,却又格外感慨这段oo历程. 一.单元架构设计 本单元任务是设计一个UML解析器,能够支持 ...
- Fastbin attack 总结
Fastbin attack 本文参考了ctf-wiki 和glibc 要了解fastbin attack,我们先要了解fastbin的机制.由于libc2.26后加入了tcache机制,我们这里就只 ...
- 【笔记】《Redis设计与实现》chapter17 集群
17.1 节点 启动节点 Redis服务器启动时会根据cluster-enabled配置选项是否为yes来决定是否开启服务器的集群模式 节点会继续使用redisServer结构来保存服务器的状态,使用 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务
我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...
- Python表达式进阶——列表表达式
x = 0 y = x*2 if x >= 0 else x print(y) # [表达式for变量in列表] l1 = [] l2 = [i for i in range(100) if i ...