网站首页 > 博客文章 正文
Java8是我们java中一个重要的更新版本,它增加了很多的新特性给我们后面的编程方式的改变奠定了重要基础。
虽然现在很多的公司和开发者逐渐的在从Java8的环境迁移到Java11(对GC做了优化可以让程序运行占用内存更小,效率更高),但是不得否认的是Java8依然是现在实用人群最多的版本,另外Java8新特性也是刚出去面试的人被问到的高频问题。
我们在之前的文章中介绍过Lambda表达式、函数式接口、Stream API这些都是Java8的新特性,这篇文章我们来介绍下它的另外一个非常实用的新特性Optional。
1. Optional的引入
如果要问起开发小伙在开发中遇到过最常见的异常是哪个,相信大部分人都会回答说NullPointerException ;因为开发项目的时候我们会写大量的代码也会用到大量的对象,在使用对象的时候偶尔避免不了忘记判断对象是否为null的情况,这样就在某些特定条件下就出现了对象为空导致程序运行报错,如果是线上的程序...那属实非常的尴尬。
当然为了避免这种问题,我们基本上都是进行对象的判空,例如下面的代码:
虽然我们知道使用if判空可以,但是这个代码很少有人用到每一个对象就去判断的,一个是因为没有这个习惯,另外一个就是可能引用太多要判断的也太多的麻烦索性就不判断;
为了解决这样的问题,Java8就引入了Optional类,用于避免使用对象的时候出现空指针的问题。
2. Optional的介绍
Optional 最早是Google公司著名的Guava项目引入的,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,在更新java8的时候也引入了Optional类。
Optional 是一个容器对象,我们把需要的数据存入到Optional容器中,这个数据可能包含或不包含非空值,如果一个值存在, isPresent()将返回true,并且通过get()方法也可以获取其值。提供依赖于存在或不存在包含值的其他方法,例如:orElse() (如果值不存在则返回默认值)和ifPresent() (如果值存在则执行代码块)。
这样我们就不用显式进行空值检测,甚至不用担心空值会进行对象调用了导致出现空指针了。
3. Optional的使用
学习Optional的使用,我们可以从两方面入手:
①如何获取一个Optional容器对象
②熟悉使用Optional常见的方法
获取Optional容器对象
获取Optional主要通过Optional.empty()、Optional.of()和Optional.ofNullable()三种方式;
Optional常见的方法
①isPresent()
isPresent 表示判断Optional对象中是否存储的为空值,如果存储为空值那么返回false,否则返回true。
②get()
Get 方法表示如果存储的值不为空那么返回这个值,但是如果为空那么就会报:
③ifPresent()
如果option对象保存的值不是null,则调用consumer对象执行accept操作,否则不执行accept;使用案例如下:
④orElse()
orElse中如果Optional中存储的值不为null就返回这个值,如果是null值那么就返回你传入的值;使用案例如下:
⑤orElseGet()
跟orElse意思差不多,不同的是orElseGet() 是如果Optional中值为null就使用函数式接口Supplier的get方法获取一个,也就是说两个方法传入的参数不一样。
⑥orElseThrow()
表示如果存储的值为null,那么就抛出一个传入的异常对象。如:
⑦filter()
如果Optional里是null值那么就返回一个Optional.empty(),如果不是null值就执行函数式接口Predicate的test方法进行条件筛选;案例如下:
⑧map()
如果是null值那么就返回Optional.empty(),如果存在值,则应用提供的mapper.apply映射函数再通过Optional.ofNullable()返回一个Optional对象。简单来说其实map跟Stream中的map含义差不多就是获取一个处理之后的新的Optional对象。案例如下:
⑨flatMap()
flatMap跟map处理的过程差不多都是不存在就返回一个empty的对象,如果有值,则通过一个映射函数获取一个Optional对象,不一样之处在于flatMap的参数通过Function接口限定了返回类型就是Optional对象不需要使用Optional.ofNullable()进行转化;案例:
最后注意,使用Optional进行操作的时候一定要利用好它的串行方法调用,而不是拆分出很多行执行,如下:
猜你喜欢
- 2024-10-09 java.util.Optional学习笔记(java.util.collection)
- 2024-10-09 如何使用Java8 Optional防止空指针异常?开发者:咋不早告诉我呢
- 2024-10-09 Java8新特性-Stream流&Optional类
- 2024-10-09 Java 8 开始新增的 Optional 类 - 创建 Optional 对象
- 2024-10-09 「Java 8」巧用Optional之优雅规避NPE问题
- 2024-10-09 优雅地解决空指针异常问题:Java8新特性之Optional
- 2024-10-09 JDK8中新增的Optional工具类真的很好用哦,建议收藏
- 2024-10-09 还在重复写空指针检查代码?考虑使用 Optional 吧
- 2024-10-09 Java 8 开始新增的 Optional 类 - Optional 对象中的返回
- 2024-10-09 Java Optional类:简化Java中的空值处理
你 发表评论:
欢迎- 07-07Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- 07-07Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- 07-07Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- 07-07Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- 07-07IT运维必会的30个工具(it运维工具软件)
- 07-07开源项目有你需要的吗?(开源项目什么意思)
- 07-07自动化测试早就跑起来了,为什么测试管理还像在走路?
- 07-07Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- 最近发表
-
- Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- IT运维必会的30个工具(it运维工具软件)
- 开源项目有你需要的吗?(开源项目什么意思)
- 自动化测试早就跑起来了,为什么测试管理还像在走路?
- Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- Cursor 太贵?这套「Cline+OpenRouter+Deepseek+Trae」组合拳更香
- 为什么没人真的用好RAG,坑都在哪里? 谈谈RAG技术架构的演进方向
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)