Optional源码分析

Java 8多了很多类,其中的Optional是一个可以包含null的容器,在Stream API中也很多地方用到Optional。
为了避免 java.lang.NullPointerException 异常,我们常常需要进行判断

    if(list!=null){
        list.get(0);
    }   

一两个这样的判断还行,但是往往项目中需要大量的这样的判断,这样常常会影响代码的阅读性和可维护性。
Java 8中的Optional就能帮助我们轻松的解决空值的处理。

Optional源码分析

构造函数都是私有的,第一个返回生成空的Optional,第二个生成不为空的Optional

   private Optional() {
        this.value = null;
    }

    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

创建Optional对象方法,都是静态方法,第一个方法为创建一个空的Optional对象,第二个生成值为你传入参数的Optional对象,第三个方法可空可不空。

    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

        public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

get()方法,当为空的时候会抛出异常。

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

isPresent() 判断是否为空,为空则返回false。

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

ifPresent()如果为空,则进行相应操作,一般为lambda表达式。

    public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }

    optional.ifPresent(this::print);
    optional.ifPresent(s-> print(s));

filter() 过滤方法,和stream API中的filter类似。

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

map()如果一个值存在,则将所提供的映射函数应用于它,如果结果是非空,则返回一个描述该项的“可选”结果。否则返回一个空的。

    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));
        }
    }

    Optional optional1 = optional .map(s -> s += "1233");

flatMap()方法和map()类似,不同点是,map可以返回任意类型,系统会自动包装为Optional,但是flatMap必须返回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));
        }
    }

orElse()不为空返回值,如果为空则返回你指定的值。这个方法可以省略isPresent()判断过程。

    public T orElse(T other) {
        return value != null ? value : other;
    }

    此处本来需要判断isPresent,用orElse则可以简洁很多
    if(optional.isPresent()){
        System.out.println(optional.get());
    }else {
        System.out.println("");
    }

    System.out.println(optional.orElse(""));

orElseGet() 方法类似于orElse(),但是不是直接返回输入参数,而是调用输入参数,返回调用的结果,这个输入参数通常是lambda

    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }

    System.out.println(optional.orElseGet(this::print));

orElseThrow() 如果值不存在,抛一个异常

    public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
        if (value != null) {
            return value;
        } else {
            throw exceptionSupplier.get();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值