jdk1.8新特性Optional的方法

一、创建Optional对象

从下图中可以看出,Optional的方法并不多,所以看起来还是很简单的。
Optional类的方法以及参数
因为Optional类的两个构造函数都是私有的,所以不能通过new的方式来创建对象。但是在Optional类中提供了 of, ofNullable, empty 三个创建类的静态方法。

of

    /**
     * Returns an {@code Optional} with the specified present non-null value.
     *
     * @param <T> the class of the value
     * @param value the value to be present, which must be non-null
     * @return an {@code Optional} with the value present
     * @throws NullPointerException if value is null
     */
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

值得注意的是 传入的value值不能为null,不然会抛出空指针异常。具体代码在Objects中的requireNonNull方法:

    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

empty

保存一个空的值,EMPTY就是new了一个空的Optional实例。

    /**
     * Returns an empty {@code Optional} instance.  No value is present for this
     * Optional.
     *
     * @apiNote Though it may be tempting to do so, avoid testing if an object
     * is empty by comparing with {@code ==} against instances returned by
     * {@code Option.empty()}. There is no guarantee that it is a singleton.
     * Instead, use {@link #isPresent()}.
     *
     * @param <T> Type of the non-existent value
     * @return an empty {@code Optional}
     */
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

ofNullable

相比于of方法,ofNullable()可以容忍value值为null。

    /**
     * Returns an {@code Optional} describing the specified value, if non-null,
     * otherwise returns an empty {@code Optional}.
     *
     * @param <T> the class of the value
     * @param value the possibly-null value to describe
     * @return an {@code Optional} with a present value if the specified value
     * is non-null, otherwise an empty {@code Optional}
     */
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

从代码中可以看出,当value值为null时,ofNullable()方法实际调用的方法时empty(),当value值不为空时,使用的是of方法。
所以当确定知道value值为null时,推荐使用empty()。当value值不为null时,推荐时用of()。当不确定value值是否为空时,就应该使用ofNullable(),以确保不会抛出异常。

二、方法

构造方法,equals,hashCode,toString就不说了。都是简单重写了一下,很容易就能懂,也没有啥好说的。先说一些常用的方法:

get

顾名思义,获取value的值。如果为null,会抛出空指针异常。

orElse

要求传入一个值,当value为null时,返回传入的默认值

orElseGet

同上,但是传入的是一个Supplier对象。使用lambda表达式就是()->{return value;},其中的Supplier返回的值就是用来替换null的默认值。

orElseThrow

同上,只不过当值为null时,会抛出传入的异常对象。注意:传入的对象任然是Supplier,但是Supplier返回的值是一个实例化的异常类。

ifPresent

当Optional的value不为空时,将把value作为Consumer的传入参数执行操作。
不同于Supplier,Consumer是必须要有入参,而Supplier必须要有出参,感兴趣可以看看Consumer,Supplier,function三个函数式接口。

map,filter,flatMap

map,同stream的map方法,链式处理传入一个function,输出一个Optional作为下一个开始。比如:

User user = new User();
Optional.of(user).map(User::getUsername).ifPresent(System.out::println);

filter,同stream的filter方法,如果Optional的value不符合条件,那么将返回一个value值为null的Optional对象。
flatMap,同map,返回的结果必须是Optional类。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值