Java Optional类源码解析和用法

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

要求:jdk1.8以上

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

常用方法:

1.of方法

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

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

2.ofNullable方法

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

public static  Optional 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 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 other) {
    return value != null ? value : other.get();
}

8.orElseThrow

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

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

public  T orElseThrow(Supplier 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 Optional map(Function 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 Optional flatMap(Function> mapper) {
    Objects.requireNonNull(mapper);
    if (!isPresent())
        return empty();
    else {
        return Objects.requireNonNull(mapper.apply(value));
    }
}

 

11.filter

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

public Optional filter(Predicate 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代表某个商家)

你可能感兴趣的:(java,工具,工作)