Optional的详解

145 阅读2分钟

1. 什么是Optional?

一个final封装类,定义了一个类型为泛型T,变量名为value的属性

2. 方法详解

(1) ofNullable:创建一个可以接收NULL的Optional对象

public static User getUser(){
    return User.builder().age(18).name("optional").build();
}

public static Optional<User> ofNullable(){
    //不为空
    return Optional.ofNullable(getUser());
}

public static Optional<User> ofNullableWithNull(){
    //为空
    return Optional.ofNullable(null);
}

(2) of:创建一个value值非NULL的Optional对象,如果传入的值为NULL,会报空指针异常

public static Optional<User> ofWithNull(){
    //如果为空,报java.lang.NullPointerException
    return Optional.of(null);
}

(3) empty: 创建一个属性value的值为NULL的Optional对象

private static final Optional<?> EMPTY = new Optional<>();
public static<T> Optional<T> empty() {
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

(4) orElseGet: 获取Optional的value值,如果不为空,返回value值,如果为空,调用Supplier的函数式接口返回

public static User getOtherUser() {
    return User.builder().age(28).name("other").build();
}

public static User getUser() {
    return User.builder().age(18).name("optional").build();
}

public static User getUserWithNull() {
    return null;
}

public static User orElseGet() {
    //不为空返回 getUser()
    return Optional.ofNullable(getUser()).orElseGet(() -> getOtherUser());
}


public static User orElseGetWithNull() {
    //为空 返回getOtherUser()
    return Optional.ofNullable(getUserWithNull()).orElseGet(() -> getOtherUser());
}

(5) orElse: 获取Optional的value值,如果不为空,返回value值,如果为空,返回参数传入的值

public static User getOtherUser() {
    return User.builder().age(28).name("other").build();
}

public static User getUser() {
    return User.builder().age(18).name("optional").build();
}

public static User getUserWithNull() {
    return null;
}

public static User orElse() {
    //不为空 返回getUser()
    return Optional.ofNullable(getUser()).orElse(getOtherUser());
}


public static User orElseWithNull() {
    //为空 返回getOtherUser()
    return Optional.ofNullable(getUserWithNull()).orElse(getOtherUser());
}

(6) orElseThrow:获取Optional的value值,如果不为空,返回value值,如果为空,调用Supplier的函数式接口抛异常

public static User getUserWithNull() {
    return null;
}

public static User orElseThrow(){
    try {
        return Optional.ofNullable(getUserWithNull()).orElseThrow(()->new Exception("不能为空"));
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

(7) ifPresent: 判断value是否为空,如果不为空,调用Consumer函数式接口执行处理逻辑,否则啥也不干

public static User getUser() {
    return User.builder().age(18).name("optional").build();
}

public static void ifPresent(){
    //不为空 执行System.out.println(user.getName())
    //为空 啥也不干
    Optional.ofNullable(getUser()).ifPresent(user -> System.out.println(user.getName()));
}

(8) filter: 过滤,调用Predicate函数式接口,为true,不做任何改变,为false,返回一个空的optional对象

public static User getUser() {
    return User.builder().age(18).name("optional").build();
}

public static Optional<User> filter() {
    //user -> user.getAge() > 10  条件为true返回getUser(),为false返回空的optional对象
    return Optional.ofNullable(getUser()).filter(user -> user.getAge() > 10);

(9) map:转换,调用Function函数式接口返回对应的Optional封装的对象

public static Optional<User> getOptionalUser() {
    return Optional.of(User.builder().age(28).name("other").build());
}

public static Optional<String> map() {
    return getOptionalUser().map(user -> user.getName());
}

常用的函数式接口Function,Consumer,Predicate,Supplier待续。。。