手记

知识输出之Optional

造出optional的目的是消除java著名的npe,其实Optional的源码很简单就是持有一个泛型的value,然后每次get结果的时候,他都会建议检查ifpresent如果存在。

常用的写法:

small_cover_url = Optional.ofNullable(user.org)
                          .map(userOrg -> userOrg.broadcast_photo_url)
                          .filter(StringTools::isNotEmpty)
                          .orElse(user.avatar);


这里附上常用的操作:也很简单

public final class Optional<T> {
    public static <T> java.util.Optional<T> of(T value) {
        return new java.util.Optional<>(value);
    }
    public static <T> java.util.Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
    public boolean isPresent() {
        return value != null;
    }
    public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }
    public java.util.Optional<T> filter(Predicate<? super T> predicate) {
        Objects.requireNonNull(predicate);
        if (!isPresent())
            return this;
        else
            return predicate.test(value) ? this : empty();
    }
    public<U> java.util.Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return java.util.Optional.ofNullable(mapper.apply(value));
        }
    }
    public<U> java.util.Optional<U> flatMap(Function<? super T, java.util.Optional<U>> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Objects.requireNonNull(mapper.apply(value));
        }
    }
    public T orElse(T other) {
        return value != null ? value : other;
    }
    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }
    public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
        if (value != null) {
            return value;
        } else {
            throw exceptionSupplier.get();
        }
    }
}

但是要注意一点:

orElse()和orElseGet()的区别。

看下源码:

public T orElse(T other) { // 在这里一定要注意,由于再传参的时候,会把参数的结果算出来,
从而传输的是结果,但是如果你的意思是这里如果存在就不执行这个操作的话,一定要换成orElseGet
(Supper<? extends T> other)这里传入的是一个方法,并且这个方法不一定会执行。只有当Option保
村的value为null时才会执行,所以一定注意!!!(同事翻车现场)
public T orElse(T other) {
    return value != null ? value : other;
}
public T orElseGet(Supplier<? extends T> other) {
    return value != null ? value : other.get();
}


1人推荐
随时随地看视频
慕课网APP