Optional概述

Optional 是个容器:它可以保存类型T的value,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测,很好地解决了空指针异常处理的问题,比如可以使用isPresent()方法判断value是否为null,使用get()方法获取value值等等。

Optional的构造方法是私有的,实例不能new,可以使用静态方法来创建:

// 1、创建一个包装对象值为空的Optional对象
Optional<String> optStr = Optional.empty();
// 2、创建包装对象值非空的Optional对象
Optional<String> optStr1 = Optional.of("optional");
// 3、创建包装对象值允许为空的Optional对象
Optional<String> optStr2 = Optional.ofNullable(null);

Optional简单案例

看完Optional的概述,我们用一个简单的例子说明一下:

下面这段代码接收一个User对象,如果user为null,则抛出异常【这是一个非常常规的避免空指针异常的做法,如果没有这步,getName会NPE】,否则返回user的name。

    public String getName1(User user) {
if (user == null) {
throw new RuntimeException("user不能为null!");
}
return user.getName();
}

如果使用Optional,应该怎么去处理呢?

    public String getName2(User user) {
return Optional.ofNullable(user) // 包装user对象,如果user为null,则返回空的Optional对象
.map(User::getName)
.orElseThrow(() -> new RuntimeException("user不能为null"));// 如果有值则返回,没有则抛出异常。
}
  • Optional使用静态的ofNullable方法将user对象进行包装,将可能为null的user对象保护起来。
    public static <T> Optional<T> ofNullable(T value) {
// empty() 方法 创建一个空的Optional对象, of对象在构造Optional的时候,value如果weinull,会引发NPE
return value == null ? empty() : of(value);
}
    public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
// 如果有值,直接返回值
if (value != null) {
return value;
} else {
// 抛出异常,这个异常Supplier接口定义
throw exceptionSupplier.get();
}
}

Optional的主要方法

方法 描述
empty 返回一个空的 Optional 实例
filter 如果值存在并且满足提供的断言, 就返回包含该值的 Optional 对象;否则返回一个空的 Optional 对象
map 如果值存在,就对该值执行提供的 mapping 函数调用
flatMap 如果值存在,就对该值执行提供的 mapping 函数调用,返回一个 Optional 类型的值,否则就返 回一个空的 Optional 对象
get 如果该值存在,将该值用 Optional 封装返回,否则抛出一个 NoSuchElementException 异常
ifPresent 如果值存在,就执行使用该值的方法调用,否则什么也不做
isPresent 如果值存在就返回 true,否则返回 false
of 将指定值用 Optional 封装之后返回,如果该值为 null,则抛出一个 NullPointerException 异常
ofNullable 将指定值用 Optional 封装之后返回,如果该值为 null,则返回一个空的 Optional 对象
orElse 如果有值则将其返回,否则返回一个默认值
orElseGet 如果有值则将其返回,否则返回一个由指定的 Supplier 接口生成的值
orElseThrow 如果有值则将其返回,否则抛出一个由指定的 Supplier 接口生成的异常

参考阅读

最新文章

  1. Flymeos插桩适配教程
  2. 常见JDBC连接数据库字符串
  3. 【Bugly干货】Android性能优化典范之多线程篇
  4. iOS-网络爬虫
  5. spring 部分配置内容备忘
  6. HDU 2276
  7. 公众平台调整SSL安全策略,开发者升级的方法
  8. XStream xml转java对象
  9. hdu 2094 产生冠军(STL,set)
  10. Oracle游标(光标)
  11. python selenium 最简单示例
  12. django请求接收及文件上传
  13. 让WebStrom支持SSH协议的子项目
  14. requests+正则爬取猫眼电影前100
  15. 为django项目创建虚拟环境
  16. 解决关于phpstorm打开速度很慢的问题
  17. 使用JWT的RSA256加密做为用户认证, 测试性能
  18. .net core Asp.net Mvc Ef 网站搭建 vs2017 1)
  19. Anaconda常用命令大全
  20. CRC在线计算工具

热门文章

  1. 第四十一章、PyQt显示部件:TextBrowser、CalendarWidget、LCDNumber、ProgressBar、Label、HorizontalLine和VerticalLine简介
  2. PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件autoExclusive属性
  3. Win10激活失败并提示错误代码0xC004C003的解决方法
  4. python——pandas技巧(处理dataframe每个元素,不用for,而用apply)
  5. setTimeout和setInterval的区别,包含内存方面的分析?
  6. asp.net在线人数限制
  7. viewer使用
  8. 看图知Docker
  9. Element-ui 实现table的合计功能
  10. AWT07-菜单组件