造出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人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦