欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【学习总结】Java中的Optional类

程序员文章站 2022-06-07 12:30:14
...

概述

  1. 可以为null的容器对象,可以保存类型T的值
  2. 可以解决空指针异常

创建Optional实例

  1. 创建空的Optional类
Optional<User> emptyOpt = Optional.empty();
  1. Of()方法:返回一个指定非 null 值的 Optional。若传入 null,会抛出 NullPointerException
Optional<User> opt = Optional.of(user)
  1. OfNullable()方法:如果入参非空,返回 Optional 描述的指定值,否则返回空的 Optional。该方法可以解决空指针异常问题
Optional<User> opt = Optional.ofNullable(user);

验证是否有值

有如下两种验证方法:

  1. boolean isPresent():有值为 true,无值为 false
  2. void ifPresent(Consumer<? super T> consumer):接受一个Consumer参数,如果值存在则使用该值调用 consumer,否则不做任何事
// 如果入参不为空,打印age
opt.ifPresent(u -> System.out.println(u.getAge()));

从Optional中返回值

  1. T get():若 opt 为空,抛出 NoSuchElementException
User user = new User("Harry", 11);
Optional<User> opt = Optional.ofNullable(user);
opt.get().getName();
  1. 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
  1. T orElseGet(Supplier<? extends T> other):如果存在值则返回值,否则执行入参的 Supplier参数,返回其执行结果
User result = Optional.orNullable(user).orElseGet(() -> user2);
  1. <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier):存在值则返回值,否则抛出由 Supplier 继承的异常
User result = Optional.ofNullable(user).orElseThrow(() -> new IllegalArgumentException());

转换值

  1. <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
  1. <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

相关标签: 学习总结 java