读java Optional 源码


//该类是jdk1.8新增的类,主要是为了解决NPE问题。

//先看构造函数:

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

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

//可以看到构造函数都是私有的。所以可以推测创建该对象的方法应该是静态的。

//来看创建对象的方法:(都是静态方法)

//结合上面的构造方法可以看到如果传入的value为null,会抛出NPE.
public static <T> Optional<T> of(T value) {
return new Optional<>(value);
}
//可以传入NULL
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}

//再看其他方法:
//返回空对象
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked")
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
//获取对象。如果未null会抛NPE.
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
//是否有value
public boolean isPresent() {
return value != null;
}
//如果有值,就消费该值
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
//符合当前断言则返回负责返回empty
public Optional<T> filter(Predicate<? super T> predicate) {
Objects.requireNonNull(predicate);
if (!isPresent())
return this;
else
return predicate.test(value) ? this : empty();
}
//通过Function转换当前对象
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));
}
}
//平行转换 和map的区别在于这里不会用optional封装,而是直接返回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));
}
}

public T orElse(T other) {
return value != null ? value : other;
}
//如果是null,则从Supplier函数中get
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();
}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值