Optional类的使用指南:解决空指针异常
在Java应用程序中,空指针异常是导致程序失败的最常见原因之一。为了更加优雅地处理空指针异常,Java8引入了Optional类库。Optional实际上是一个容器,可以保存类型T的值,或者仅仅保存null。通过使用Optional,我们能够避免显式进行空值检测,使代码更加清晰和健壮。
1.Optional类是什么?
Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
2. 创建Optional对象
Java8提供了两种方式来创建Optional对象:
Optional.of():of()不允许参数是nullOptional.ofNullable():ofNullable()则没有限制// 参数不能是nullOptional optional1 = Optional.of(1);// ofNullable参数可以是nullOptional optional2 = Optional.ofNullable(null);// ofNullable参数也可以不是nullOptional optional3 = Optional.ofNullable(2);
3. 判断值是否存在
使用isPresent()方法可以判断Optional对象中的值是否存在。
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Integer> optional2 = Optional.ofNullable(null);System.out.println(optional1.isPresent()); // trueSystem.out.println(optional2.isPresent()); // false
4. 如果值存在,则执行操作
ifPresent(Consumer consumer)方法,可以在Optional对象保存的值不为null时执行指定的操作
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Integer> optional2 = Optional.ofNullable(null);// 如果不是null,调用Consumeroptional1.ifPresent(value -> System.out.println("value is " + value));// null,不调用Consumeroptional2.ifPresent(value -> System.out.println("value is " + value));
输出结果:
value is 1
5. 获取值或默认值
orElse(value)方法,可以在Optional对象保存的值不为null时返回原来的值,否则返回指定的默认值
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Integer> optional2 = Optional.ofNullable(null);System.out.println(optional1.orElse(1000)); // 1System.out.println(optional2.orElse(1000)); // 1000
6. 异常处理
orElseThrow()方法可以在值不存在时抛出异常,存在时什么都不做,类似于Guava的Precoditions
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Integer> optional2 = Optional.ofNullable(null);optional1.orElseThrow(() -> new IllegalStateException());try { optional2.orElseThrow(() -> new IllegalStateException());} catch (IllegalStateException e) { e.printStackTrace();}
7. 过滤和映射操作
Optional类还提供了filter(Predicate)和map(Function)方法,用于对Optional对象中保存的值进行过滤和映射
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Integer> optional2 = Optional.ofNullable(null);Optional<Integer> filter1 = optional1.filter(a -> a == null);Optional<Integer> filter2 = optional1.filter(a -> a == 1);Optional<Integer> filter3 = optional2.filter(a -> a == null);System.out.println(filter1.isPresent()); // falseSystem.out.println(filter2.isPresent()); // trueSystem.out.println(filter2.get().intValue() == 1); // trueSystem.out.println(filter3.isPresent()); // falseOptional<String> str1Optional = optional1.map(a -> "key" + a);Optional<String> str2Optional = optional2.map(a -> "key" + a);System.out.println(str1Optional.get()); // key1System.out.println(str2Optional.isPresent()); // false
8. flatMap操作
flatMap()方法与map()相似,不同之处在于flatMap()的mapping函数返回值必须是Optional类型
Optional<Integer> optional1 = Optional.ofNullable(1);Optional<Optional<String>> str1Optional = optional1.map(a -> Optional.of("key" + a));Optional<String> str2Optional = optional1.flatMap(a -> Optional.of("key" + a));System.out.println(str1Optional.get().get()); // key1System.out.println(str2Optional.get()); // key1
9. Optional类的方法总结
方法
描述
empty
返回一个空的 Optional 实例
of
将指定值用 Optional 封装之后返回,如果该值为 null,则抛出一个 NullPointerException 异常
ofNullable
将指定值用 Optional 封装之后返回,如果该值为 null,则返回一个空的 Optional 对象
orElse
如果有值则将其返回,否则返回一个默认值
orElseThrow
如果有值则将其返回,否则抛出一个由指定的 Supplier 接口生成的异常
filter
如果值存在并且满足提供的断言, 就返回包含该值的 Optional 对象;否则返回一个空的 Optional 对象
map
如果值存在,就对该值执行提供的 mapping 函数调用
flatMap
如果值存在,就对该值执行提供的 mapping 函数调用,返回一个 Optional 类型的值,否则就返 回一个空的 Optional 对象
本文链接:http://www.28at.com/showinfo-26-70386-0.htmlOptional类的使用指南:解决空指针异常
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 因天气情况,申通快递对发往 12 省份快件提价:3 公斤以上每公斤涨 1-3 元
下一篇: 一文了解this指针的奥秘
相关知识
为什么不建议你用去 “! = null” 做判空?
java 异常捕获机制
类和对象(上)
Swift 编程入门:iOS 开发的最佳选择
Java中的异常处理机制是怎样的
简述java中的异常与捕获机制
Pytorch自定义Dataset和DataLoader去除不存在和空的数据
二重指针解析
花毛茛自选种子繁殖栽培技术(Ranunculus optional seed propagation and Cultivation Techniques).doc
什么是swift编程语言
网址: Optional类的使用指南:解决空指针异常 https://www.huajiangbk.com/newsview1901501.html
上一篇: 君子兰花箭“卡脖子”了怎么办?这 |
下一篇: 如何给君子兰浇水画箭的时候不容易 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039