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<Object> empty = Optional.empty();

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

Optional<String> of = Optional.of("helloWord");

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

Optional<Object> 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<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }

4.ifPresentOrElse()

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

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

5.filter()

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

public Optional<T> filter(Predicate<? super T> 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<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }

7.flatMap()

与 map 方法相似,只是 map 方法接收的 Function 是 Function<? super T, ? extends U>

而 flatMap 方法接收的 Function 是 Function<? super T, ? extends Optional<? extends U>,所以apply方法需要返回一个 Optional 对象

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值