Jdk1.8新特性-optional
程序员文章站
2022-06-04 21:59:31
...
传统的写代码方式经常会遇到NullPointerException,这就需要我们在代码中经常判空。而判空的写法又会显得很累赘,这里就可以用到Optional来让我们的代码更加优雅。
Optional是在java.util包下的一个用于代替null的一个工具类。
Optional的构造方法
- Optional.of(T value): value需要非 null,null会抛异常;
- Optional.ofNullable(T value): value为null的话返回-Optional.empty();
- Optional.empty(): 用来构造一个空的 Optional;
Optional的相关方法介绍
-
isPresent(): 持有非空值,返回true;否则false;
-
ifPresent(): 如果 Optional 中有值,则对该值调用consumer.accept,否则什么也不做。
-
orElse: 参数是一个值,如果 Optional 中有值则将其返回,否则返回 orElse 方法传入的参数。
-
orElseGet: 传入的参数为一个 Supplier 接口的实现。
-
orElseThrow: 没有值的时候会抛出异常,抛出的异常由传入的 exceptionSupplier 提供。
-
map: 为空返回 Optional.empty;否则返回一个新的 Optional:函数 mapper 在以 value 作为输入时的输出值;可以多次使用map操作。
Optional<String> username = Optional.ofNullable(getUserById(id))
.map(user -> user.getUsername())
.map(name -> name.replace('_', ' '));
System.out.println("Username is: " + username.orElse("Unknown"));
- flatMap: map 方法参数中的函数 mapper 输出的是值,然后 map 方法会使用 Optional.ofNullable 将其包装为 Optional;而 flatMap 要求参数中的函数 mapper 输出的就是 Optional。
Optional<String> username = Optional.ofNullable(getUserById(id))
.flatMap(user -> Optional.of(user.getUsername()))
.flatMap(name -> Optional.of(name.toLowerCase()));
System.out.println("Username is: " + username.orElse("Unknown"));
- filter: 接受一个 Predicate 来对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty。