美文网首页
Java新特性-Optional类

Java新特性-Optional类

作者: Harper324 | 来源:发表于2019-03-05 23:15 被阅读0次

定义

Optional 类是一个可以为null的容器对象,它可以保存类型T的值,或者仅仅保存null。Optional 类的引入很好的解决空指针异常。

声明

        //    创建Optional对象的三种方式
        Optional<String> empty = Optional.empty();

        String name = "Alex";
        Optional<String> optA = Optional.of(name);

        String gender = "female";
        Optional<String> optB = Optional.ofNullable(gender);

常用方法

//      判断是否为空
        System.out.println(optA.isPresent());//true
//        System.out.println(optB.isEmpty());
        System.out.println(empty.isPresent());//false

//        ifPresent() 方法里面接受一个lambda表达式,表示当对象存在时需要执行的操作。
        optA.ifPresent(value -> System.out.println(value));//Alex


        System.out.println(optA.orElse("a"));//Alex
        System.out.println(empty.orElse("a"));//a
        String nullName = null;
        String name2 = Optional.ofNullable(nullName).orElseGet(() -> "a");//用Optional.of()会报错
        System.out.println(name2);//a

//        orElseThrow() 方法表示当Optional里面的值为空的时候,抛出一个异常
//        String name3 = Optional.ofNullable(nullName).orElseThrow(IllegalArgumentException::new);

//        get()方法表示当Optional的对象不为空的时候,返回Optional对象里面的内容。
        System.out.println(optB.get());//female

orElse()与orElseGet()的区别

源码
   // orElse()
   public T orElse(T other) {
        return value != null ? value : other;
    }
    //orElseGet()
        public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }

例子

import java.util.Optional;

public class OptionalDemo {
    static String b() {
        System.out.println("B");
        return "B";
    }
    static String a() {
        System.out.println("A");
        return "A";
    }
    public static void main(String[] args) {
        //    创建Optional对象的三种方式
        Optional<String> empty = Optional.empty();

        String name = "Alex";
        Optional<String> optA = Optional.of(name);

        String gender = "female";
        Optional<String> optB = Optional.ofNullable(gender);
                String nullName = null;
        String name2 = Optional.ofNullable(nullName).orElseGet(() -> "a");
        String name3 = empty.orElse( "a");
        String name4 = optA.orElse(a());
        String name5 = optA.orElseGet(()->b());

        System.out.println(name2);//a
        System.out.println(name3);
        System.out.println(name4);
        System.out.println(name5);
    }
}

// 输出结果
A
a
a
Alex
Alex
差别
  1. 由输出结果可知,当Optional的值是空值时,无论orElse还是orElseGet都会执行;而当Optional有值时,orElse会执行,而orElseGet则不会执行。
  2. 传入的参数不同,orElse要传入和Optional一致的数据类型,orElseGet传入Lambda表达式

相关文章

网友评论

      本文标题:Java新特性-Optional类

      本文链接:https://www.haomeiwen.com/subject/vhmauqtx.html