Java Optional类源码解析和用法

44 篇文章 0 订阅
20 篇文章 0 订阅

个人网站:http://xiaocaoshare.com/

要求:jdk1.8以上

Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象

常用方法:

1.of方法

为非null的值创建一个Optional,如果值为空则抛出一个空指针异常

public static <T> Optional<T> of(T value) {
    return new Optional<>(value);
}
private Optional(T value) {
    this.value = Objects.requireNonNull(value);
}
public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

2.ofNullable方法

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional

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

 

3.isPresent方法

如果值存在返回true,否则返回false。

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

4.get方法

如果Optional有值则将其返回,否则抛出NoSuchElementException。

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

5.ifPresent

如果Optional实例有值则为其调用consumer,否则不做处理

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

6.orElse

如果有值则将其返回,否则返回指定的其它值。

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

 

7.orElseGet

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值

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

8.orElseThrow

如果有值则将其返回,否则抛出supplier接口创建的异常。

在orElseGet方法中,我们传入一个Supplier接口。然而,在orElseThrow中我们可以传入一个lambda表达式或方法,如果值不存在来抛出异常。

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

9.map

如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。

map方法用来对Optional实例的值执行一系列操作。通过一组实现了Function接口的lambda表达式传入操作。

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

10.flatMap

如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。

flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是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));
    }
}

 

11.filter

如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional

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

常用写法:

1.

Coupon coupon = couponService.getCoupon(id);
Optional.ofNullable(coupon)
        .filter(o -> o.getValid())
        .filter(o -> programToken.equals(o.getProgramToken()))
        .orElseThrow(() -> new MiniException(ErrCode.COUPON_NOT_EXISTS.getName()));

根据Id查询对象,判断对象是否存在(valid为1表示数据有效,0表示已删除,token代表某个商家)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值