zl程序教程

您现在的位置是:首页 >  后端

当前栏目

软件开发 | Java8超实用新特性之——Optional解决空指针问题

软件开发 解决 特性 指针 实用 java8 optional 问题
2023-09-14 09:11:07 时间

Java8是我们java中一个重要的更新版本,它增加了很多的新特性给我们后面的编程方式的改变奠定了重要基础。

虽然现在很多的公司和开发者逐渐的在从Java8的环境迁移到Java11(对GC做了优化可以让程序运行占用内存更小,效率更高),但是不得否认的是Java8依然是现在实用人群最多的版本,另外Java8新特性也是刚出去面试的人被问到的高频问题。

我们在之前的文章中介绍过Lambda表达式、函数式接口、Stream API这些都是Java8的新特性,这篇文章我们来介绍下它的另外一个非常实用的新特性Optional。

  1. Optional的引入

如果要问起开发小伙在开发中遇到过最常见的异常是哪个,相信大部分人都会回答说NullPointerException ;因为开发项目的时候我们会写大量的代码也会用到大量的对象,在使用对象的时候偶尔避免不了忘记判断对象是否为null的情况,这样就在某些特定条件下就出现了对象为空导致程序运行报错,如果是线上的程序…那属实非常的尴尬。

当然为了避免这种问题,我们基本上都是进行对象的判空,例如下面的代码:

图片

虽然我们知道使用if判空可以,但是这个代码很少有人用到每一个对象就去判断的,一个是因为没有这个习惯,另外一个就是可能引用太多要判断的也太多的麻烦索性就不判断;

为了解决这样的问题,Java8就引入了Optional类,用于避免使用对象的时候出现空指针的问题。

  1. Optional的介绍

Optional 最早是Google公司著名的Guava项目引入的,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,在更新java8的时候也引入了Optional类。

Optional 是一个容器对象,我们把需要的数据存入到Optional容器中,这个数据可能包含或不包含非空值,如果一个值存在, isPresent()将返回true,并且通过get()方法也可以获取其值。提供依赖于存在或不存在包含值的其他方法,例如:orElse() (如果值不存在则返回默认值)和ifPresent() (如果值存在则执行代码块)。

这样我们就不用显式进行空值检测,甚至不用担心空值会进行对象调用了导致出现空指针了。

  1. Optional的使用

学习Optional的使用,我们可以从两方面入手:

①如何获取一个Optional容器对象

②熟悉使用Optional常见的方法

获取Optional容器对象

获取Optional主要通过Optional.empty()、Optional.of()和Optional.ofNullable()三种方式;

图片

Optional常见的方法

①isPresent()

图片

isPresent 表示判断Optional对象中是否存储的为空值,如果存储为空值那么返回false,否则返回true。

图片

②get()

图片

Get 方法表示如果存储的值不为空那么返回这个值,但是如果为空那么就会报:

③ifPresent()

图片

如果option对象保存的值不是null,则调用consumer对象执行accept操作,否则不执行accept;使用案例如下:

图片

④orElse()

图片

orElse中如果Optional中存储的值不为null就返回这个值,如果是null值那么就返回你传入的值;使用案例如下:

图片

图片

⑤orElseGet()

图片

跟orElse意思差不多,不同的是orElseGet() 是如果Optional中值为null就使用函数式接口Supplier的get方法获取一个,也就是说两个方法传入的参数不一样。

图片

⑥orElseThrow()

图片

表示如果存储的值为null,那么就抛出一个传入的异常对象。如:

图片

⑦filter()

图片

如果Optional里是null值那么就返回一个Optional.empty(),如果不是null值就执行函数式接口Predicate的test方法进行条件筛选;案例如下:

图片

⑧map()

图片

如果是null值那么就返回Optional.empty(),如果存在值,则应用提供的mapper.apply映射函数再通过Optional.ofNullable()返回一个Optional对象。简单来说其实map跟Stream中的map含义差不多就是获取一个处理之后的新的Optional对象。案例如下:

图片

⑨flatMap()

图片

flatMap跟map处理的过程差不多都是不存在就返回一个empty的对象,如果有值,则通过一个映射函数获取一个Optional对象,不一样之处在于flatMap的参数通过Function接口限定了返回类型就是Optional对象不需要使用Optional.ofNullable()进行转化;案例:

图片

最后注意,使用Optional进行操作的时候一定要利用好它的串行方法调用,而不是拆分出很多行执行,如下:

图片

图片