首页 > 编程笔记 > Java笔记 阅读:5

Java Optional类的用法(附带实例)

Java 中的 Optional 类像是一个容器,可以保存任何对象,并且针对 NullPointerException 空指针异常做了优化,保证 Optional 类保存的值不会是 null。因此,Optional 类是针对“对象可能是 null 也可能不是 null”的场景为开发者提供了优质的解决方案,减少了烦琐的异常处理。

Optional 类是用 final 修饰的,因此不能有子类。由于 Optional 类是带有泛型的类,因此可以保存任何对象的值。从 Optional 类的声明代码中就可以看出这些特性,JDK 中的部分代码如下:
public final class Optional<T> {
    private final T value; // 省略其他代码
    ...
}
Optional 类中有一个叫作 value 的成员属性,这个属性就是用来保存具体值的。value 是用泛型 T 修饰的,并且还用了 final 修饰,这表示一个 Optional 对象只能保存一个值。

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对象的值是:使用默认值

相关文章