Java8--Optional

简介

Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供了很多有用的方法。这样我们就不用显示进行空值检测。
Optional类的引入了很好的解决空指针异常。

Optional 容器类的常用方法

  1. Optional.of(T t):创建一个Optional实例
 User user1 =new User("赵六",20,10000);
 Optional<User> user11 = Optional.of(user1);
 System.out.println(user11.get());
 -----------------------输出-------------------
 User{name='赵六', age=20, salary=10000.0}
 ------------------------------------------------
 //注意Optional.of()不能创建空实例
 Optional<Object> o = Optional.of(null);
 System.out.println(o.get());
 ---------------------输出-------------------
 java.lang.NullPointerException
 //说明这个方法只能创建不为空的Optional实例
  1. Optional.empty():创建一个空的Optional实例
 Optional<Object> empty = Optional.empty();
 System.out.println(empty.get());
 ------------------------输出-----------------
 java.util.NoSuchElementException: No value present
 //不会报空指针异常了吗,直接说明在那个地方遇到了没有值
  1. Optional.ofNullable(T t):若t不为null,创建Optional实例,否则创建空实例
Optional<User> user = Optional.ofNullable(new User("赵六",20,10000));
System.out.println(user.get());
 -----------------------输出-------------------
 User{name='赵六', age=20, salary=10000.0}
 ------------------------------------------------
 Optional<Object> o = Optional.ofNullable(null);
 System.out.println(o.get());
 -----------------------输出-------------------
  java.util.NoSuchElementException: No value present
 //不会报空指针异常了吗,直接说明在那个地方遇到了没有值
  1. isPresent():判断是否存在值
Optional<User> user = Optional.of(new User("赵六", 20, 10000));
System.out.println(user.isPresent());
-----------------------输出-------------------
true
  1. orElse(T t):如果调用对象包含值,则返回该值,否则返回T
 Optional<User> user = Optional.ofNullable(null);
 System.out.println(user.orElse(new User("赵六",20,10000)));
  -----------------------输出-------------------
 User{name='赵六', age=20, salary=10000.0}
  1. orElseGet(Supplier s):如果该值存在,返回该值,否则返回s获取的值
 Optional<User> user = Optional.ofNullable(null);
 System.out.println(user.orElseGet(()->new User("赵六",20,10000)));
 -----------------------输出-------------------
 User{name='赵六', age=20, salary=10000.0}
  1. orElseThrow(Supplier s):如果存在该值,返回包含的值,否则抛出由Supplier继承的异常
Optional<User> user = Optional.ofNullable(null);
user.orElseThrow(()->new IllegalArgumentException("nihao"));
-----------------------输出-------------------
java.lang.IllegalArgumentException: nihao

补充
java9里为Optional类添加了三个方法:or()、ifPresentOrElse()和stream()

  1. or(Supplier s):如果存在该值,就返回该值,否则返回由Supplier参数产生的另一个Optional对象
Optional<User> user = Optional.ofNullable(null);
Optional<User> or = user.or(() -> Optional.of(new User("赵六",20,10000)));
System.out.println(or.get());
 -----------------------输出-------------------
 User{name='赵六', age=20, salary=10000.0}
  1. ifPresentOrElse(Consumer c,Runnable r):如果存在该值,就执行Consumer,否则就执行Runnable
 Optional<User> user = Optional.ofNullable(null);
 user.ifPresentOrElse(System.out::println, ()-> System.out.println("不存在值"));
 -----------------------输出-------------------
 不存在值
  1. stream():就是把Optional实例转换为Stream对象,如果没有值,它会得到一个空的Stream

java10里为Optional类添加了orElseThrow()
orElseThrow():就是主动抛出异常

Optional<User> user = Optional.ofNullable(null);
user.orElseThrow();
-----------------------输出-------------------
java.util.NoSuchElementException: No value present

java11里为Optional类添加了isEmpty()
isEmpty(),判断是否为空

Optional<User> user = Optional.ofNullable(null);
System.out.println(user.isEmpty());
-----------------------输出-------------------
true

总结

Optional 主要用作返回类型。在获取到这个类型的实例后,如果它有值,你可以取得这个值,否则可以进行一些替代行为。

Optional 类有一个非常有用的用例,就是将其与流或其它返回 Optional 的方法结合,以构建流畅的API。
补充

Optional同样有filter,map,flatMap这些方法
不过它们返回的都是Optional对象
map可以返回Optional.empty()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值