造出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(); }