在Java 8中,引入了新的类Optional,它是一个容器类,代表一个值存在或不存在,我们可以使用它来避免空指针异常。在这篇文章中,我们将讨论Java 8中的Optional类以及它的使用方法。
Optional的介绍
在Java中,我们经常需要处理一些有可能为空的值,例如数据库查询结果返回空或者读取配置文件中的属性可能为空等。在以前,我们通常会通过判断是否为null来解决这些问题,但是这样会导致许多冗余的代码和重复的逻辑。在Java 8中,引入了Optional类来解决这个问题。
Optional类是一个容器类,它可以包含一个非空的值,也可以不包含任何值。当Optional包含一个非空的值时,我们称其为存在的值,当Optional不包含任何值时,我们称其为空的值。Optional提供了一组方法来安全地访问这个值,避免因为空指针异常而导致程序的崩溃。
Optional的使用方法
创建一个Optional对象
我们可以通过调用静态方法Optional.of(value)来创建一个包含非空值的Optional对象,如果value为null,则会抛出NullPointerException。
Optional optional = Optional.of("hello");
我们也可以通过调用静态方法Optional.empty()来创建一个空的Optional对象:
Optional
除此之外,我们还可以通过调用静态方法Optional.ofNullable(value)来创建Optional对象,如果value为null,则这个Optional对象不包含任何值。
String str = null; Optional optional = Optional.ofNullable(str);
访问Optional对象的值
Optional类提供了以下方法来访问Optional对象的值:
- get():返回Optional对象的值
- orElse(T other):如果Optional对象不包含任何值,则返回other,否则返回Optional对象的值
- orElseGet(Supplier supplier):如果Optional对象不包含任何值,则返回supplier.get()的值,否则返回Optional对象的值
- orElseThrow(Supplier exceptionSupplier):如果Optional对象不包含任何值,则抛出exceptionSupplier提供的异常,否则返回Optional对象的值
它们的使用方法如下:
Optional optional = Optional.of("hello"); String value = optional.get(); // 返回"hello" String other = "world"; String result = optional.orElse(other); // 返回"hello" String value1 = optional.orElseGet(() -> other); // 返回"hello" String value2 = optional.orElseThrow(() -> new RuntimeException("value is null")); // 返回"hello"
Optional的 Mapping 方法
Optional还提供了一组Mapping方法,它们可以将Optional对象中的值进行转换或者扁平化处理:
- map(Function mapper):将Optional对象中的值进行转换,返回一个新的Optional对象
- flatMap(Function<? super T, Optional> mapper):将Optional对象中的值进行扁平化处理,返回一个新的Optional对象
它们的使用如下所示:
Optional optional = Optional.of("hello"); Optional lengthOptional = optional.map(String::length); // lengthOptional的值为Optional[5] Optional flatLengthOptional = optional.flatMap(s -> Optional.of(s.length())); // flatLengthOptional的值为Optional[5]
Optional的 Filter 方法
Optional还提供了一个Filter方法,它可以过滤Optional对象中的值,返回一个新的Optional对象或者空的Optional对象:
Optional optional = Optional.of("hello"); Optional filteredOptional = optional.filter(s -> s.startsWith("h")); // 返回Optional["hello"] Optional emptyOptional = optional.filter(s -> s.startsWith("w")); // 返回Optional.empty
Optional的使用场景
Optional并不是一个万能的工具,也并不是所有场景都适合使用Optional。我们应该根据具体的场景来决定是否使用Optional。
下面是一些使用Optional的场景:
- 方法返回值:我们可以使用Optional来指示一个方法的返回值可能为空
- 集合中的元素:在集合中存储Optional对象的引用,而不是空对象或者null
- 读取配置属性:使用Optional可以避免空指针异常导致程序崩溃
总结
本文介绍了Java 8中的Optional类以及它的使用方法,包括创建Optional对象、访问Optional对象的值、Mapping方法、Filter方法以及Optional的使用场景。使用Optional可以有效地避免空指针异常,减少冗余的代码和重复的逻辑,提高程序的可读性和可维护性。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/246818.html