Loading

Optional类

前言

到目前为止,空指针异常是导致Java应用程序失败最常见的原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方法防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。

Optional类(java.util.Optional)是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表是这个值不存在。原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。

类方法

序号 方法 & 描述
1 static Optional empty()返回空的 Optional 实例。
2 boolean equals(Object obj)判断其他对象是否等于 Optional。
3 Optional filter(Predicate<? super predicate)如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。
4 Optional flatMap(Function<? super T,Optional> mapper)如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional
5 T get()如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException
6 int hashCode()返回存在值的哈希码,如果值不存在 返回 0。
7 void ifPresent(Consumer<? super T> consumer)如果值存在则使用该值调用 consumer , 否则不做任何事情。
8 boolean isPresent()如果值存在则方法会返回true,否则返回 false。
9 Optional map(Function<? super T,? extends U> mapper)如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。
10 static Optional of(T value)返回一个指定非null值的Optional。
11 static Optional ofNullable(T value)如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。
12 T orElse(T other)如果存在该值,返回值, 否则返回 other。
13 T orElseGet(Supplier<? extends T> other)如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。
14 T orElseThrow(Supplier<? extends X> exceptionSupplier)如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常
15 String toString()返回一个Optional的非空字符串,用来调试

我们可以通过以下实例来更好的了解 Optional 类的使用:

public class OptionalTest {
    static class Boy{
        private String name;

        public Boy() {
        }

        public Boy(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "Boy{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
======================================================================================
    public static void main(String[] args) {
        // 1、在一段代码中,获取某个值。像下面这么写会导致空指针
        Boy boy = new Boy();
        boy = null; // 用来演示空指针效果
        String name = boy.name;
        System.out.println("name = " + name);


        // 2、一般情况下为了 免空指针 我们会使用 条件判断 将代码优化一下
        Boy boy1 = new Boy();
        boy1 = null;
        if (boy1!=null){
            String name1 = boy1.name;
            System.out.println("name = " + name1);
        }

        // 3、现在我们也可以优雅的使用Optional类进行空指针的规避

        Boy boy2 = new Boy();
        boy2 = null;
        // Optional.ofNullable - 允许传递为 null 参数
        Optional<Boy> optionalBoy = Optional.ofNullable(boy2);
        // Optional.isPresent - 判断值是否存在
        boolean present = optionalBoy.isPresent();
        // Optional.orElse - 如果值存在,返回它,否则返回默认值  new Boy("盐离子")
        Boy orElse_Boy = optionalBoy.orElse(new Boy("盐离子"));
        // 下面获取值的时候,如果值存在,返回的就是一开始装进ofNullable中的对象;
        // 如果值不存在,返回的就是 orElse(new Boy("盐离子"))中new的对象
        String name = orElse_Boy.name;
        System.out.println("name = " + name);

        // ------------------------分割线--------------------------
        // 如果我们十分确定获取的对象一定存在,我们可以直接使用 get()方法直接获得;
        // Optional容器中如果没有,直接使用get()方法,会报 NoSuchElementException;
        Boy boy3 = optionalBoy.get();
        String name3 = boy3.name;
        System.out.println("name3 = " + name3);
    }
}

posted @ 2021-06-09 17:06  Helen's  阅读(193)  评论(0编辑  收藏  举报