【学习总结】Java中的Optional类
程序员文章站
2022-06-07 12:30:14
...
概述
- 可以为null的容器对象,可以保存类型T的值
- 可以解决空指针异常
创建Optional实例
- 创建空的Optional类
Optional<User> emptyOpt = Optional.empty();
- Of()方法:返回一个指定非 null 值的 Optional。若传入 null,会抛出 NullPointerException
Optional<User> opt = Optional.of(user)
- OfNullable()方法:如果入参非空,返回 Optional 描述的指定值,否则返回空的 Optional。该方法可以解决空指针异常问题
Optional<User> opt = Optional.ofNullable(user);
验证是否有值
有如下两种验证方法:
- boolean isPresent():有值为 true,无值为 false
- void ifPresent(Consumer<? super T> consumer):接受一个Consumer参数,如果值存在则使用该值调用 consumer,否则不做任何事
// 如果入参不为空,打印age
opt.ifPresent(u -> System.out.println(u.getAge()));
从Optional中返回值
- T get():若 opt 为空,抛出 NoSuchElementException
User user = new User("Harry", 11);
Optional<User> opt = Optional.ofNullable(user);
opt.get().getName();
- T orElse(T other):如果存在值则返回值,否则返回 other
User user1 = null;
User user2 = new User("Harry", 11);
User resultA = Optional.ofNullable(user1).orElse(user2); // 返回user2
User user3 = new User("Ron", 12);
User resultB = Optional.ofNullable(user2).orElse(user3); // 返回user2
- T orElseGet(Supplier<? extends T> other):如果存在值则返回值,否则执行入参的 Supplier参数,返回其执行结果
User result = Optional.orNullable(user).orElseGet(() -> user2);
- <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier):存在值则返回值,否则抛出由 Supplier 继承的异常
User result = Optional.ofNullable(user).orElseThrow(() -> new IllegalArgumentException());
转换值
- <U>Optional<U> map(Function<? super T,? extends U> mapper):如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。
User user1 = new User("Harry", 11);
User user2 = null;
String name1 = Optional.ofNullable(user1).map(u -> u.getName()).orElse("John Doe"); // 返回Harry
String name2 = Optional.ofNullable(user2).map(u -> u.getName()).orElse("John Doe"); // 返回John Doe
-
<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper):如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional。
与 map() 的区别在于,map方法返回的值应为 Optional 类型
String name = Optional.ofNullable(user).flatMap(u -> u.getOptName()).orElse("default");
User类中的 getOptName() 方法:
public Optional<String> getOptName(){
return Optional.ofNullable(name);
}
过滤值
Optional<T> filter(Predicate<? super <T> predicate):如果值存在,并且这个值匹配给定的 predicate,测试结果为 true 则返回一个 Optional 用以描述这个值,否则返回一个空的Optional。
Optional<User> result = Optional.ofNullable(user).
filter(u -> u.getName() != null && u.getAge() > 0 && u.getAge() < 100);
参考:
https://www.cnblogs.com/zhangboyu/p/7580262.html
https://www.runoob.com/java/java8-optional-class.html
上一篇: go - time 获取指定时间所在月份的第一天0点
下一篇: 蜂蜜清火吗?一起来了解蜂蜜吧