学习Java的Optional类

154 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

什么是Optional

每个Java 程序员看到NullPointerException空指针异常都心头一惊,空指针可能会导致代码崩溃。想避免就不得不使用经常使用判断。

为了解决这个问题,Java8引入了一个新类 Optional。Optional可以帮助我们写出更简洁的代码,而无需使用太多的空检查。而且通过使用Optional,我们还可以指定要返回的替代值或要运行的替代代码。这使得我们的代码更具可读性。

下面我们就来学习一下Optional类的基础操作吧

empty()

使用empty()方法可以创建一个空的Optional对象

        Optional<String> object = Optional.empty();
        try {
            // 如果存在则输出值,如果不存在则返回orElse
            System.out.println(object.orElse("orElse"));  // orElse
            // 存在输出Value,不存在则执行Supplier的get()并返回结果。
            String res = object.orElseGet(() -> {
                return "result";
            });
            System.out.println(res); // result
            //如果不存在会抛出oSuchElementException异常
            System.out.println(object.get());
        } catch (Exception e) {
            System.out.println(e); // java.util.NoSuchElementException: No value present
        }

使用orElse()/orElseGet()/get()可以从Optional类的实例中获取值,执行结果如下

orElse
result
java.util.NoSuchElementException: No value present

使用empty()方法可以创建一个空的Optional对象

of(T value)

使用of()方法创建一个含有值的Optional对象

        Optional<String> object = Optional.of("HooW");
        try {
            // 如果存在则输出值,如果不存在则返回orElse
            System.out.println(object.orElse("orElse"));  // HooW
            // 存在值则输出Value,不存在则执行Supplier的get()并返回结果
            String res = object.orElseGet(() -> {
                return "result";
            });
            System.out.println(res); // HooW
            //如果不存在会抛出oSuchElementException异常
            System.out.println(object.get()); //HooW
        } catch (Exception e) {
            System.out.println(e);
        }

执行结果如下

HooW
HooW
HooW

of()方法中可以创建一个带有值的Optional对象

ofNullable(T value)

使用Optional.ofNullable()方法创建一个对象,该对象是of方法的结果

        //  如果值为null,则认为Optional对象为空值
        Optional<String> object = Optional.ofNullable(null);
        try {
            // 为空则返回orElse
            System.out.println(object.orElse("orElse")); // orElse

            // 如果存在:Value,如果不存在:执行Supplier的get()并返回结果。
            var res = object.orElseGet(() -> {
                return "result";
            });
            System.out.println(res); // result

            // 获取价值。如果不存在,NoSuchElementException
            System.out.println(object.get());
        } catch (Exception e) {
            System.out.println(e); // java.util.NoSuchElementException: No value present
        }

执行结果如下。

orElse
result
java.util.NoSuchElementException: No value present

接下来我们看一下不为null时的情况

        Optional<String> object = Optional.ofNullable("HooW");
        try {
            System.out.println(object.orElse("orElse")); // HooW
            
            var res = object.orElseGet(() -> {
                return "result";
            });
            System.out.println(res); // HooW


            System.out.println(object.get()); //HooW
        } catch (Exception e) {
            System.out.println(e); 
        }

执行结果如下

HooW
HooW
HooW

所以如果使用ofNullable()方法将Optional的值置为null,则可创建一个为空的Optional对象;

Optional.of()Optional.ofNullable() 的区别在于of()不允许参数是null,ofNullable()无限制

isPresent()

isPresent()方法可以检查Optional对象的存在

        // 创建一个空的可选对象
        Optional<String> object1 = Optional.ofNullable(null);
        Optional<String> object2 = Optional.ofNullable("HooW");

        // 仅在存在时显示
        object1.ifPresent(System.out::println);
        System.out.println("------------------");
        object2.ifPresent(System.out::println); // HooW

执行结果如下。

------------------
HooW