Java8新特性之Optional类

Java8对null有更优雅的处理方式Optional类。html

Opthonal类结构

生成Optional对象

  • Optional.empty
Optional<Object> empty = Optional.empty();

EMPTY持有某个类型的空值结构,调用empty()返回的便是该实例java

  • Optional.ofapp

    仍是返回空指针异常,不常用函数

  • Optional.ofNullable指针

    为空,返回empty对象code

为空处理

user = Optional.ofNullable(user).orElse(createUser());
    user = Optional.ofNullable(user).orElseGet(() -> createUser());
  • orElse(T other)

    当other不为空时,依然会执行括号中的代码htm

  • orElseGet(Supplier<? extends T> other)

    rElseGet函数并不会执行createUser()方法对象

  • orElseThrow(Supplier<? extends X> exceptionSupplier)

    value值为null时,直接抛一个异常出去blog

流处理

  • map(Function<? super T, ? extends U> mapper)

  • flatMap(Function<? super T, Optional<U>> mapper)

这两个函数,在函数体上没什么区别。惟一区别的就是入参,map函数所接受的入参类型为Function<? super T, ? extends U>,而flapMap的入参类型为Function<? super T, Optional<U>>。ci

在具体用法上,对于map而言: 若是User结构是下面这样的

public class User {
    private String name;
    public String getName() {
        return name;
    }
}

这时候取name的写法以下所示

String city = Optional.ofNullable(user).map(u-> u.getName()).get();

对于flatMap而言: 若是User结构是下面这样的

public class User {
    private String name;
    public Optional<String> getName() {
        return Optional.ofNullable(name);
    }
}

这时候取name的写法以下所示

String city = Optional.ofNullable(user).flatMap(u-> u.getName()).get();

判空处理

  • isPresent()

  • ifPresent(Consumer<? super T> consumer)

Optional.ofNullable(user).ifPresent(u->{
            // TODO: do something
        });

过滤

filter(Predicate<? super T> predicate)

Optional<User> user1 = Optional.ofNullable(user).filter(u -> u.getName().length()<6);

filter 方法接受一个 Predicate 来对 Optional 中包含的值进行过滤,若是包含的值知足条件,那么仍是返回这个 Optional;不然返回 Optional.empty。

参考文章

https://www.cnblogs.com/rjzheng/p/9163246.html

相关文章
相关标签/搜索