Java Optional类的用法(附带实例)
Java 中的 Optional 类像是一个容器,可以保存任何对象,并且针对 NullPointerException 空指针异常做了优化,保证 Optional 类保存的值不会是 null。因此,Optional 类是针对“对象可能是 null 也可能不是 null”的场景为开发者提供了优质的解决方案,减少了烦琐的异常处理。
Optional 类是用 final 修饰的,因此不能有子类。由于 Optional 类是带有泛型的类,因此可以保存任何对象的值。从 Optional 类的声明代码中就可以看出这些特性,JDK 中的部分代码如下:
Optional 类提供了很多封装、校验和获取值的方法,这些方法如下表所示:
【实例】使用 Optional 类创建“空”对象。创建一个 Optional 对象,并赋予一个字符串类型的值,然后判断此对象的值是否为空;再使用 empty() 方法创建一个“空值”的 Optional 对象,然后判断此对象的值是否为空。
Optional 类是用 final 修饰的,因此不能有子类。由于 Optional 类是带有泛型的类,因此可以保存任何对象的值。从 Optional 类的声明代码中就可以看出这些特性,JDK 中的部分代码如下:
public final class Optional<T> { private final T value; // 省略其他代码 ... }Optional 类中有一个叫作 value 的成员属性,这个属性就是用来保存具体值的。value 是用泛型 T 修饰的,并且还用了 final 修饰,这表示一个 Optional 对象只能保存一个值。
Optional 类提供了很多封装、校验和获取值的方法,这些方法如下表所示:
方法 | 返回类型 | 功能描述 |
---|---|---|
empty() | Optional<T> | 静态方法。返回一个表示空值的 Optional 实例 |
filter() | Optional<T> | 如果 Optional 实例的 value 是有值的,并且该值与给定条件匹配,则返回包含这个值的 Optional 实例,否则返回一个表示空值的 Optional 实例 |
get() | T | 如果 Optional 实例的 value 有值,则返回值,否则抛出 NoSuchElementException 异常 |
of(T value) | Optional<T> | 静态方法。返回一个 value 值等于参数值的 Optional 实例 |
ofNullable(T value) | Optional<T> | 返回一个 value 值等于参数值的非 null 的 Optional 实例 |
orElse(T other) | T | 如果 Optional 实例的 value 是有值的,则返回 value 值,否则返回参数值 |
除 Optional 类外,还可以使用 OptionalDouble、OptionalInt 和 OptionalLon 这 3 个类,开发者可以根据不同的应用场景进行灵活选择。
【实例】使用 Optional 类创建“空”对象。创建一个 Optional 对象,并赋予一个字符串类型的值,然后判断此对象的值是否为空;再使用 empty() 方法创建一个“空值”的 Optional 对象,然后判断此对象的值是否为空。
import java.util.Optional; public class OptionalDemo { public static void main(String[] args) { Optional<String> strValue = Optional.of("Hello"); //创建有值对象 boolean haveValueFlag = strValue.isPresent(); //判断对象中的值是不是空的 System.out.println("strValue 对象是否有值:" + haveValueFlag); if (haveValueFlag) { //如果不是空的 String str = strValue.get(); //获取对象中的值 System.out.println("strValue 对象的值是:" + str); } Optional<String> noValue = Optional.empty(); //创建空值对象 boolean noValueFlag = noValue.isPresent(); //判断对象中的值是不是空的 System.out.println("noValue 对象是否有值:" + noValueFlag); if (noValueFlag) { //如果不是空的 String str = noValue.get(); //获取对象中的值 System.out.println("noValue 对象的值是:" + str); } else { //如果是空的 String str = noValue.orElse("使用默认值"); //使用默认值 System.out.println("noValue 对象的值是:" + str); } } }运行结果如下:
strValue对象是否有值:true
strValue对象的值是:Hello
noValue对象是否有值:false
noValue对象的值是:使用默认值