【学习总结】Java中的Optional类

概述

  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值