Optional

Posted flying-snake

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Optional相关的知识,希望对你有一定的参考价值。

Optional 主要解决的问题: NullPointerException

文档说明

  • Option 是一个容器对象,可能包含,也可能不包含一个非null的值
  • 它是一个基于值的对象
    • 被 final 修饰,不可变(允许包含指向可变对象的引用);
    • 有 equals、hashCode、toString 方法的实现,但只仅仅是通过实例本身的状态来得出的;
    • 不会使用敏感的操作,如实例之间的相等(==)、实例之间的 hashCode 比较、对象内置的锁的操作
    • 被认为是 equal 的情况,仅仅基于 equals 方法,而不会基于引用相等性(==);
    • 无可访问的构造方法(构造方法私有),实例通过工厂方法创建,工厂不保证返回实例的一致性;
    • 当相等时,它们可以自由替换,当 equals 方法返回 true 时,x 与 y 可以任意交换

方法

工厂方法

  • empty:构造一个容器里为 null 的对象(值为 null 的 Optional)
  • of(T t):构造一个非空 Optional,若 T 为 null,则报空指针异常
  • ofNullable(T t):构造一个里面值可能为 null,也可能不为 null 的 Optional 对象

常用操作方法

  • get:将 value 取出
  • ifPresent:判断容器中是否有对象存在

一般会在有可能出现 NullPointerException 的地方,通过 ofNullable 构造一个 Optional 并返回;然后获取对象时,通过 ifPresent 判断对象是否为 null

例子

有一个 Student 类

public class Student 
    private String name;
    private Integer age;
    public Student(String name, Integer age) 
        this.name = name;
        this.age = age;
    
    @Override
    public String toString() 
        return "Studentname=" + name + ", age=" + age + ‘‘;
    

分别通过不同方式构造 Optional 并打印的结果如下

import java.util.Optional;
public class OptionTest 
    public static void main(String[] args) 
        Optional<Object> empty = Optional.empty();
        Optional<Student> of1 = Optional.of(new Student("Tom", 18));
        Student s = null;
//        Optional<Student> of2 = Optional.of(s); // NullPointerException
        Optional<Student> ofNullable = Optional.ofNullable(s);

//        System.out.println(empty.get());  // NoSuchElementException
        System.out.println(of1.get());  // Studentname=Tom, age=18
//        System.out.println(of2.get());  // 不会执行
//        System.out.println(ofNullable.get());   // NoSuchElementException
        System.out.println(empty.isPresent());  // false
        System.out.println(of1.isPresent());    // true
        System.out.println(ofNullable.isPresent()); // false
    

最后,关于使用 Optional 的注意点

  • 不要将 Optional 作为方法参数或者在类中声明为成员变量
  • Optional 没有实现 Serializable 接口
  • Optional 通常只作为方法的返回值,用于规避空指针异常

以上是关于Optional的主要内容,如果未能解决你的问题,请参考以下文章

JDK8中新增的Optional工具类真的很好用哦,建议收藏

JDK8中新增的Optional工具类真的很好用哦,建议收藏

Java8新特性Lambda表达式&Stream流&方法引用最全集锦