Java8的Optional如何干掉空指针(示例详解)

 更新时间:2021年01月04日 08:55:04   作者:天乔巴夏丶  
这篇文章主要介绍了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空指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringMVC的概念以及快速入门示例

    SpringMVC的概念以及快速入门示例

    这篇文章主要介绍了SpringMVC的概念以及快速入门示例,SpringMVC 已经成为目前最主流的MVC框架之一,它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口,需要的朋友可以参考下
    2023-05-05
  • java 如何在list中删除我指定的对象

    java 如何在list中删除我指定的对象

    这篇文章主要介绍了java 如何在list中删除我指定的对象,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 高效的java版排列组合算法

    高效的java版排列组合算法

    这篇文章主要为大家详细介绍了高效的java版排列组合算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • java引用jpython的方法示例

    java引用jpython的方法示例

    这篇文章主要介绍了java引用jpython的方法,结合实例形式分析了java引用jpython及相关使用技巧,需要的朋友可以参考下
    2016-11-11
  • 关于Springboot如何获取IOC容器

    关于Springboot如何获取IOC容器

    大家好,我是孤焰。最近我在制作日志审计功能时发现不知道怎样获取到Springboot项目中的IOC容器,经过摸索,最终解决了这个问题,现在把解决方式和大家分享一下
    2021-08-08
  • 详解spring cloud分布式关于熔断器

    详解spring cloud分布式关于熔断器

    这篇文章主要介绍了详解spring cloud分布式关于熔断器,详细的介绍了什么是熔断器和使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 深入浅出MappedByteBuffer(推荐)

    深入浅出MappedByteBuffer(推荐)

    MappedByteBuffer使用虚拟内存,因此分配(map)的内存大小不受JVM的-Xmx参数限制,但是也是有大小限制的,这篇文章主要介绍了MappedByteBuffer的基本知识,需要的朋友可以参考下
    2022-12-12
  • Java for循环倒序输出的操作代码

    Java for循环倒序输出的操作代码

    在Java中,要实现一个for循环的倒序输出,通常我们会使用数组或集合(如ArrayList)作为数据源,然后通过倒序遍历这个数组或集合来实现,这篇文章主要介绍了Java for循环倒序输出,需要的朋友可以参考下
    2024-07-07
  • java简单实现八叉树图像处理代码示例

    java简单实现八叉树图像处理代码示例

    这篇文章主要介绍了java简单实现八叉树图像处理代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • SpringBoot实现无限级评论回复的项目实践

    SpringBoot实现无限级评论回复的项目实践

    本文主要介绍了SpringBoot实现无限级评论回复的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论