优雅的处理空值 -- optional的使用
优雅的处理空值 -- optional的使用
熟悉 Java 8 的都知道,java8 引入Optional 类来空指针异常(NullPointerException) 程序员都非常了解的异常。
本质上,Optional是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。
Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
简单实践
import java.util.Optional;
/**
 * @author xingzhou
 * @version 1.0.0
 * @ClassName OptionalTest.java
 * @Description TODO
 * @createTime 2022年03月28日 19:14:00
 */
public class OptionalTest {
    public static void main(String args[]){
        OptionalTest test = new OptionalTest();
        Integer value1 = null;
        Integer value2 = new Integer(10);
        // Optional.ofNullable - 允许传递为 null 参数
        Optional<Integer> a = Optional.ofNullable(value1);
        // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
        Optional<Integer> b = Optional.of(value2);
        System.out.println(test.sum(a,b));
    }
    public Integer sum(Optional<Integer> a, Optional<Integer> b){
        // Optional.isPresent - 判断值是否存在
        System.out.println("第一个参数值存在: " + a.isPresent());
        System.out.println("第二个参数值存在: " + b.isPresent());
        // Optional.orElse - 如果值存在,返回它,否则返回默认值
        Integer value1 = a.orElse(new Integer(0));
        //Optional.get - 获取值,值需要存在
        Integer value2 = b.get();
        return value1 + value2;
    }
}
创建 Optional 实例
重申一下,这个类型的对象可能包含值,也可能为空。你可以使用同名方法创建一个空的 Optional。

可以看出,Optional类的两个构造方法都是private型的,因此类外部不能显示的使用new Optional()的方式来创建Optional对象,但是Optional类提供了三个静态方法empty()、of(T value)、ofNullable(T value)来创建Optinal对象,示例如下:
// 1、创建一个包装对象值为空的Optional对象
Optional<String> optStr = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optStr1 = Optional.of("optional");
// 3、创建包装对象值允许为空的Optional对象
Optional<String> optStr2 = Optional.ofNullable(null);
非优雅写法
    public static String getGender(Student student)
    {
        Optional<Student> stuOpt =  Optional.ofNullable(student);
        if(stuOpt.isPresent())
        {
            return stuOpt.get().getGender();
        }
        
        return "Unkown";
    }
上例子中的用法不但没有减少null的防御性检查,而且增加了Optional包装的过程,违背了Optional设计的初衷,因此开发中要避免这种糟糕的使用。
推荐写法-- Optional.ifPresent()
方法一:
    public static void printName(Student student)
    {
        Optional.ofNullable(student).ifPresent(u ->  System.out.println("The student name is : " + u.getName()));
    }
方法二:
// 优雅
Optional<String> status = ... ;
status.ifPresentOrElse(
    System.out::println,
    () -> System.out.println("Status not found")
)
方法三:(jdk9)
// 优雅
public Optional<String> fetchStatus() {
    Optional<String> status = ... ;
    Optional<String> defaultStatus = Optional.of("PENDING");
    return status.or(() -> defaultStatus);
    // 或者不需要定义defaultStatus
    // return status.or(() -> Optional.of("PENDING"));
}
                    
                
                
            
        
浙公网安备 33010602011771号