使用 Java8 Optional 的正确姿势

Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
最简单的使用,如下:

Optional optVal = Optional.ofNullable(val);
if (optVal.isPresent()) {
       System.out.println(optVal.get());
}else{
  System.out.println("空值");
}

其实这样是等同于jdk8之前的使用方式:

        if (val!=null) {
            System.out.println(optVal.get());
        }else{
            System.out.println("空值");
        }

所以我们需要关注下面这些方法:

public Optional map(Functionsuper T, ? extends U> mapper)
public T orElse(T other)
public T orElseGet(Supplier other)
public void ifPresent(Consumersuper T> consumer)
public Optional filter(Predicatesuper T> predicate)
public Optional flatMap(Functionsuper T, Optional> mapper)
public  T orElseThrow(Supplier exceptionSupplier) throws X

下面我们一一尝试,先简单描述一下Optional 类的构造方法:

  • 方法 Optional.of(T value) 给定的值一定不为空,如果为空则抛出
    NullPointerException

    -方法 Optional.ofNullable(T value) 给定的值可能为空,也可能不为空
  • 方法 Optional.empty() 空的Optional

方法ifPresent的使用

Optional optVal = Optional.ofNullable(val);
optVal.ifPresent((s)-> System.out.println(s));

如果存在值,则输出

方法orElse的使用

Optional optVal = Optional.ofNullable(val);
Integer orElse = optVal.orElse(1);

如果存在返回当前值,否则返回1

方法orElseGet的使用

Integer orElseGet = optVal.orElseGet(() -> returnInt());
private int returnInt() {
    return 2;
}

如果存在返回当前值,否则返回方法调用方法返回的值

方法orElseThrow的使用

Integer orElseThrow = optVal.orElseThrow(() -> new RuntimeException("参数为空"));

如果存在返回当前值,否则抛出异常

方法map的使用

User user = new User();
user.setName("optional");
Optional optUer = Optional.of(user);
String name = optUer.map(s -> s.getName()).map(s -> s.toUpperCase()).orElse("空值");

这段代码其实和下面这一段很类似

if (user != null) {
      String name1 = user.getName();
      if (name1 != null) {
            System.out.println(name1.toUpperCase());
      }else {
           System.out.println("空值");
        }
  }else {
       System.out.println("空值");
 }

但是通过对比能看出使用 Optional 后代码更加见解和明了

原文地址

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