Optional

Optional类是Java8为了解决null值判断问题,使用Optional类可以避免显式的null值判断(null的防御性检查),避免null导致的NPE(NullPointerException)。

对比

    public static void main(String[] args) {
        TestDemo testDemo = new TestDemo();
        getCount(testDemo);
    }

    private static void getCount(TestDemo testDemo) {
        //if判断:判断好多层
        int count1 = 1;
        if(testDemo != null){
            if(testDemo.getCount() != null){
                count1 = testDemo.getCount();
            }
        }
        System.out.println(count1);

        //三目运算符:嵌套层数深,可读性不好
        int count2 = testDemo != null ? (testDemo.getCount() != null ? testDemo.getCount() : 1) : 1;
        System.out.println(count2);

        //Java8-Optional:优雅,可读性较好
        int count3 = Optional.ofNullable(testDemo).map(TestDemo::getCount).orElse(1);
        System.out.println(count3);
    }

    private static class TestDemo {

        private Integer count;

        public Integer getCount() {
            return count;
        }

        public void setCount(Integer count) {
            this.count = count;
        }
    }

源码

of

public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }


 private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }


 public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

可以看到,传入的值为null时,会手动抛出空指针异常;

ofNullable

public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

 public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

// EMPTY常量是由Optional的无参构造函数创建的对象
private static final Optional<?> EMPTY = new Optional<>();

//EMPTY常量是由Optional的无参构造函数创建的对象;无参构造函数的代码
private Optional() {
        this.value = null;
    }

可以看到,无参构造函数创建了一个value为null的对象;所以,ofNullable 方法创建对象时,允许传入的值为空;为空时创建一个value=null的对象;


   转载规则


《Optional》 锦泉 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
ThreadLocal ThreadLocal
WeakReference弱引用对象相对软引用对象具有更短暂的生命周期,只要 G C 发现它仅有弱引用,不管内存空间是否充足,都会回收它,不过 G C 是一个优先级很低的线程,因此不一定会很快发现那些仅有弱引用的对象。 只有对象仅被 Wea
2021-06-03
下一篇 
try-catch,throw和throws的使用 try-catch,throw和throws的使用
Java 中的异常有很多,这种异常机制,可以帮助处理程序中未知的错误
2021-06-01
  目录