Java8的Optional:如何干掉空指针?
Optional概述
Optional 是个容器:它可以保存类型T的value,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测,很好地解决了空指针异常处理的问题,比如可以使用isPresent()
方法判断value是否为null,使用get()
方法获取value值等等。
Optional的构造方法是私有的,实例不能new,可以使用静态方法来创建:
// 1、创建一个包装对象值为空的Optional对象
Optional<String> optStr = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optStr1 = Optional.of("optional");
// 3、创建包装对象值允许为空的Optional对象
Optional<String> optStr2 = Optional.ofNullable(null);
Optional简单案例
看完Optional的概述,我们用一个简单的例子说明一下:
下面这段代码接收一个User对象,如果user为null,则抛出异常【这是一个非常常规的避免空指针异常的做法,如果没有这步,getName会NPE】,否则返回user的name。
public String getName1(User user) {
if (user == null) {
throw new RuntimeException("user不能为null!");
}
return user.getName();
}
如果使用Optional,应该怎么去处理呢?
public String getName2(User user) {
return Optional.ofNullable(user) // 包装user对象,如果user为null,则返回空的Optional对象
.map(User::getName)
.orElseThrow(() -> new RuntimeException("user不能为null"));// 如果有值则返回,没有则抛出异常。
}
- Optional使用静态的
ofNullable
方法将user对象进行包装,将可能为null的user对象保护起来。
public static <T> Optional<T> ofNullable(T value) {
// empty() 方法 创建一个空的Optional对象, of对象在构造Optional的时候,value如果weinull,会引发NPE
return value == null ? empty() : of(value);
}
- orElseThrow方法接收一个Supplier 对象,这里我们在lambda表达式那节已经说过了,不再赘述,感兴趣可以查看:Java8的Lambda表达式,你会不?
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
// 如果有值,直接返回值
if (value != null) {
return value;
} else {
// 抛出异常,这个异常Supplier接口定义
throw exceptionSupplier.get();
}
}
Optional的主要方法
方法 | 描述 |
---|---|
empty |
返回一个空的 Optional 实例 |
filter |
如果值存在并且满足提供的断言, 就返回包含该值的 Optional 对象;否则返回一个空的 Optional 对象 |
map |
如果值存在,就对该值执行提供的 mapping 函数调用 |
flatMap |
如果值存在,就对该值执行提供的 mapping 函数调用,返回一个 Optional 类型的值,否则就返 回一个空的 Optional 对象 |
get |
如果该值存在,将该值用 Optional 封装返回,否则抛出一个 NoSuchElementException 异常 |
ifPresent |
如果值存在,就执行使用该值的方法调用,否则什么也不做 |
isPresent |
如果值存在就返回 true,否则返回 false |
of |
将指定值用 Optional 封装之后返回,如果该值为 null,则抛出一个 NullPointerException 异常 |
ofNullable |
将指定值用 Optional 封装之后返回,如果该值为 null,则返回一个空的 Optional 对象 |
orElse |
如果有值则将其返回,否则返回一个默认值 |
orElseGet |
如果有值则将其返回,否则返回一个由指定的 Supplier 接口生成的值 |
orElseThrow |
如果有值则将其返回,否则抛出一个由指定的 Supplier 接口生成的异常 |
参考阅读
- Java 8 Optional 类
- 【java8新特性 简述】Optional
- https://github.com/biezhi/learn-java8/blob/master/java8-optional/README.md
Java8的Optional:如何干掉空指针?的更多相关文章
- Java8之Optional类
写在前头 今天再看阿里的Java开发手册,里面异常处理第10条提到这样一个建议. [推荐]防止 NPE ,是程序员的基本修养,注意 NPE 产生的场景:1 ) 返回类型为基本数据类型,return 包 ...
- java8 用Optional取代null
如何处理null 怎样做才能避免不期而至的NullPointerException呢?通常,可以在需要的地方添加null的检查(过于激进的防御式检查甚至会在不太需要的地方添加检测代码),并且添加的方式 ...
- java8中optional和.stream().map()
使用optional的好处:是一个可以包含或不可以包含非空值的容器对象,更加友好的处理程序中的空对象. Optional<T>有方法 isPresent() 和 get() 是用来检查其包 ...
- java8 stream/optional个人测试demo记录
备忘记录 package cc.ash; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConst ...
- 讲讲Java8的Optional类
前言 Java 8中引入了 Optional 类来解决 NullPointerException 与繁琐的 null 检查,该类首次出现在 Guava.Java 8 才成为类库中的一部分. 入门 Op ...
- 聊一聊Java8 Optional,让你的代码更加优雅
码农在囧途 随着时间的推移,曾经我们觉得重要的东西,可能在今天看来是如此的浅薄和无知,同理,今天我们放不下,想不开,觉得重要的东西,多年后我们可能也会觉得也就那样,所以,今天的的所有烦恼,忧愁,想不开 ...
- 【原创】JAVA8之妙用Optional解决NPE问题
引言 在文章的开头,先说下NPE问题,NPE问题就是,我们在开发中经常碰到的NullPointerException.假设我们有两个类,他们的UML类图如下图所示 在这种情况下,有如下代码 user. ...
- Java8 Optional的简单操作
我们经常会遇到这种情况:首先判断一个对象是否为null,如果不为null,获取一个对象中的一个属性,如果该属性不为null,又获取该属性的属性,如果该属性的属性不为null,又获取属性的属性的属性: ...
- 乐字节Java8核心特性之Optional类
大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦. Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在 ...
随机推荐
- Docker实战 | 第三篇:Docker安装Nginx,实现基于vue-element-admin框架构建的项目线上部署
一. 前言 在上一文中 点击跳转 通过IDEA集成Docker插件实现微服务的一键部署,但 youlai-mall 是前后端分离的项目,除了后端微服务的部署之外,当然还少不了前端工程的部署.所以本篇讲 ...
- 重要消息:MoviePy v2.0.0.dev1预发布版本已经可以下载安装使用
☞ ░ 前往老猿Python博文目录 ░ 刚刚得知,MoviePy v2.0.0.dev1版本已经预发布,据说解决了多语言支持及TextClip等一系列Bug,大家不妨升级使用.升级指令:pip in ...
- 问题:PyCharm调试方法Force Step over与step over的区别
Force Step over与step over的差别是,后者在执行到函数时,如果函数中设置了断点,会在该函数断点处暂停,等待进一步调试指令,而Force Step over不论函数中是否有断点,都 ...
- 第15.9节 PyQt学习入门:使用Qt Designer进行GUI设计的步骤
在使用Qt Designer进行GUI设计时,一般常规的步骤都是差不多的,主要步骤包括新建显示窗口.在窗口上按照规划的布局放置组件.设置初始化组件的属性.定义信号和槽函数的连接,一般后三步是每增加一个 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的enabled属性
enabled属性非常简单,最开始老猿没准备介绍该属性的,因为大家都应该知道,但仔细看了看官网文章,觉得还是有些细节可能很少有人注意到,因此还是在此介绍一下. enabled属性用于表示部件是否可用, ...
- PyQt(Python+Qt)学习随笔:Designer中的QDialogButtonBox的clicked信号参数QAbstractButton *解决办法
一.引言 QDialogButtonBox本身只提供4种信号,分别是accepted.rejected.clicked和helpRequested,在<PyQt(Python+Qt)学习随笔:D ...
- 升级openssl和openssh版本
一.安装telnet-server服务(建议安装) 1. 查看系统是否已安装telnet-server,linux系统上默认已经安装telnet-client(或telnet),而telnet-ser ...
- [python学习手册-笔记]004.动态类型
004.动态类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...
- 解决Linux所有命令不能使用的问题
解决Linux所有命令不能使用的问题 出现这个问题说明你的 /etc/profile 配置出现了问题,一般是因为path配置出现了问题.排除添加内容中的错误,然后重启一个新窗口执行执行 source ...
- js处理浏览器兼容
1.try catch 在try中执行我们的代码,如果在执行的过程中发生了异常信息,我们在catch中写代替的执行方案 前提:不兼容四位情况下,执行对应的代码,需要发生异常错误才可以检测到 弊端:不 ...