Skip to content

Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。Optional类的引入很好的解决空指针异常。

三种创建optional对象方式

java
public void test01(){
    // 1.创建空optional
    Optional.empty();

    // 2.使用非null值创建optional对象,使用null会报错
    Optional.of("test");

    // 3.可以使用任意值创建
    Optional.ofNullable(null);
}

正常引用和引用缺失情况下的使用

java
public void test01() {
    Optional<Object> optional = Optional.of("I love java");
    /**
      * 如果 optional 不为空才会执行 ifPresent 中的方法
      * 类似的方法:map filter flatMap
      */
    optional.ifPresent(System.out::println);


    //当optional引用缺失时,赋值给一个默认值
    optional.orElse("引用缺失");
    optional.orElseGet(() -> {
        // TODO 业务处理代码
        return "自定义引用缺失";
    });
    optional.orElseThrow(() -> {
        throw new RuntimeException("当引用缺少时,自定义抛出一个异常");
    });
}

编码实战

观察下面的代码,很简单遍历传递过来的集合并打印。

问题:如果传递过来的是 null 改如何处理,可以使用 if 判断,但结合 steam 有更好的方式,使用 optionsl

java
public static void testFor(List<String> list) {
    list.forEach(System.out::println);
}

改进后代码

java
public static void testFor(List<String> list) {
    // Stream::empty 代表创建一个空流,可以理解成 () -> Stream.empty()
    Optional.ofNullable(list).map(List::stream).orElseGet(Stream::empty).forEach(System.out::print);
}