当前位置:首页 > 科技  > 软件

Optional类的使用指南:解决空指针异常

来源: 责编: 时间:2024-02-01 12:41:35 247观看
导读在Java应用程序中,空指针异常是导致程序失败的最常见原因之一。为了更加优雅地处理空指针异常,Java8引入了Optional类库。Optional实际上是一个容器,可以保存类型T的值,或者仅仅保存null。通过使用Optional,我们能够避免显

在Java应用程序中,空指针异常是导致程序失败的最常见原因之一。为了更加优雅地处理空指针异常,Java8引入了Optional类库。Optional实际上是一个容器,可以保存类型T的值,或者仅仅保存null。通过使用Optional,我们能够避免显式进行空值检测,使代码更加清晰和健壮。4SE28资讯网——每日最新资讯28at.com

1.Optional类是什么?

Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。4SE28资讯网——每日最新资讯28at.com

Optional提供很多有用的方法,这样我们就不用显式进行空值检测。4SE28资讯网——每日最新资讯28at.com

2. 创建Optional对象

Java8提供了两种方式来创建Optional对象:4SE28资讯网——每日最新资讯28at.com

  • Optional.of():of()不允许参数是null
  • Optional.ofNullable():ofNullable()则没有限制
// 参数不能是nullOptional optional1 = Optional.of(1);// ofNullable参数可以是nullOptional optional2 = Optional.ofNullable(null);// ofNullable参数也可以不是nullOptional optional3 = Optional.ofNullable(2);

3. 判断值是否存在

使用isPresent()方法可以判断Optional对象中的值是否存在。4SE28资讯网——每日最新资讯28at.com

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时执行指定的操作4SE28资讯网——每日最新资讯28at.com

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));

输出结果:4SE28资讯网——每日最新资讯28at.com

value is 1

5. 获取值或默认值

orElse(value)方法,可以在Optional对象保存的值不为null时返回原来的值,否则返回指定的默认值4SE28资讯网——每日最新资讯28at.com

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的Precoditions4SE28资讯网——每日最新资讯28at.com

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对象中保存的值进行过滤和映射4SE28资讯网——每日最新资讯28at.com

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类型4SE28资讯网——每日最新资讯28at.com

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类的方法总结

方法
4SE28资讯网——每日最新资讯28at.com

描述
4SE28资讯网——每日最新资讯28at.com

empty
4SE28资讯网——每日最新资讯28at.com

返回一个空的 Optional 实例
4SE28资讯网——每日最新资讯28at.com

of
4SE28资讯网——每日最新资讯28at.com

将指定值用 Optional 封装之后返回,如果该值为 null,则抛出一个 NullPointerException 异常
4SE28资讯网——每日最新资讯28at.com

ofNullable
4SE28资讯网——每日最新资讯28at.com

将指定值用 Optional 封装之后返回,如果该值为 null,则返回一个空的 Optional 对象
4SE28资讯网——每日最新资讯28at.com

orElse
4SE28资讯网——每日最新资讯28at.com

如果有值则将其返回,否则返回一个默认值
4SE28资讯网——每日最新资讯28at.com

orElseThrow
4SE28资讯网——每日最新资讯28at.com

如果有值则将其返回,否则抛出一个由指定的 Supplier 接口生成的异常
4SE28资讯网——每日最新资讯28at.com

filter
4SE28资讯网——每日最新资讯28at.com

如果值存在并且满足提供的断言, 就返回包含该值的 Optional 对象;否则返回一个空的 Optional 对象
4SE28资讯网——每日最新资讯28at.com

map
4SE28资讯网——每日最新资讯28at.com

如果值存在,就对该值执行提供的 mapping 函数调用
4SE28资讯网——每日最新资讯28at.com

flatMap
4SE28资讯网——每日最新资讯28at.com

如果值存在,就对该值执行提供的 mapping 函数调用,返回一个 Optional 类型的值,否则就返 回一个空的 Optional 对象
4SE28资讯网——每日最新资讯28at.com


4SE28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-70386-0.htmlOptional类的使用指南:解决空指针异常

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 因天气情况,申通快递对发往 12 省份快件提价:3 公斤以上每公斤涨 1-3 元

下一篇: 一文了解this指针的奥秘

标签:
  • 热门焦点
  • 帅气纯真少年!日本最帅初中生选美冠军出炉

    日本第一帅哥初一生选美大赛冠军现已正式出炉,冠军是来自千叶县的宗田悠良。日本一直热衷于各种选美大赛,从&ldquo;最美JK&rdquo;起到&ldquo;最美女星&r
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • iQOO Neo8系列新品发布会

    旗舰双芯 更强更Pro
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top