Java8之Optional

简介

        Optional 类是 Java 8 才引入的,Optional 是个容器类,它可以保存类型 T 的值,或者仅仅保存null。Optional 提供了很多方法,不用显式进行空值检测,Optional 类的引入很好的解决空指针异常。

好处

        1、可以避免出现 NullPointerException 异常。

        2、使代码更加健壮,减少出现异常的可能性。

        3、提高代码的可读性,使代码更加简洁明了。

        4、使代码更加易于维护和理解,因为它能够明确地指定一个值是否可为空。

对象创建

        Optional它的构造函数是私有的,所以我们不能通过 new 来创建 Optional 对象,它提供了三个静态的方法,empty、of 和 ofNullable,通过这三个方法可以获取到一个 Optional 对象。

empty():创建一个包装对象为null的Optional

Optional empty = Optional.empty(); 
  

of():创建一个包装对象为非null的Optional ,如果为null会报空指针异常

Optional of = Optional.of("helloWord");

ofNullable():创建一个包装对象可能为null的Optional ,如果为null就等价于empty()

Optional ofNullable = Optional.ofNullable(null); 
  
常用方法

1.get()

获取 Optional 包装的对象,如果包装的对象为 null,会抛出空指针

public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

2.isPresent()

判断 Optional 包装的对象是否为 null

public boolean isPresent() {
        return value != null;
    }

3.isPresent()

判断 Optional 包装的对象是否为 null,如果不为 null,则执行 Consumer 的 accept 方法

public void ifPresent(Consumer consumer) {
        if (value != null)
            consumer.accept(value);
    }

4.ifPresentOrElse()

判断 Optional 包装的对象是否为 null,如果不为 null,则执行 Consumer 的 accept 方法,否则就会执行 Runable 的 run 方法

    public void ifPresentOrElse(Consumer action, Runnable emptyAction) {
        if (value != null) {
            action.accept(value);
        } else {
            emptyAction.run();
        }
    }

5.filter()

filter 方法通过 Predicate 判断是否满足条件,如果满足则返回该对象,不满足则返回一个包装 null的 Optional 对象

public Optional filter(Predicate predicate) {
        Objects.requireNonNull(predicate);
        if (!isPresent())
            return this;
        else
            return predicate.test(value) ? this : empty();
    }

6.map()

map 方法首先判断 Optional 包装的对象是否为 null,如果为 null 则返回一个包装 null 的 Optional对象;否则,通过 Function 的 apply 方法运算,获得一个新值包装成一个新的 Optional 对象并返回

public Optional map(Function mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }

7.flatMap()

与 map 方法相似,只是 map 方法接收的 Function 是 Function

而 flatMap 方法接收的 Function 是 Function,所以apply方法需要返回一个 Optional 对象

public Optional flatMap(Function> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Objects.requireNonNull(mapper.apply(value));
        }
    }
总结

        可以有效地避免 null 引用异常,但也需要注意不要过度使用 Optional,以免代码变得复杂难以维护

你可能感兴趣的:(Java8,java)