news 2026/5/4 22:33:03

Optional的学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Optional的学习

Optional的核心

减少代码里出现 空指针异常(NullPointerException)的情况

常见使用场景

当你想使用某个对象中的方法,但又不清楚这个对象是不是为null,这个时候,你就会想到用

if( xxx != null)来判断这个对象是不是null,而Optional的出现,就可以替换这行代码,不需要每次都去判断对象。

定义审批实体(Approve)

import lombok.*; import java.time.LocalDateTime; import java.util.List; @Data @NoArgsConstructor @AllArgsConstructor public class Approve { private String approveId; private CreateApprove createInfo; } @Data @NoArgsConstructor @AllArgsConstructor class CreateApprove { private String creator; private LocalDateTime createTime; }

具体Demo--1

import java.util.*; public class OptionalDemo { public static void main(String[] args) { //假设这是从数据库拿到的数据,数据库返回的就是null Approve app = null; //链式加载,一个个方法依照调用顺序,依次执行 //ofNullable方法 将对象包装成Optional对象,如果传入对象是null,ofNullable会创建一个 Optional.EMPTY对象 Optional.ofNullable(app) .filter(p -> p.getApproveId().equals("approveId-A")) //兜底,如果传入对象为 null,或者filter过滤出来的结果是EMPTY。就会执行orElse()方法 .orElse(new Approve()); // 等价于上面Optional的逻辑 if (app != null) { if (app.getApproveId().equals("approveId-A")) { } else { app = new Approve(); } } } }

ofNullable() 方法

ofNullable方法的作用是将传入的对象进行包装。其实就是创建一个Optional对象,并将传入的对象赋值给Optional对象的value属性。

如果传入的对象是null,ofNullable方法会返回一个空Optional对象(value是空的),这个是空Optional对象是单例的,全局只会创建这么一个实例。

为什么filter方法没有报空指针?

因为 isPresent() 会判断当前Optional对象的value是否为null,如果value是null,就会直接返回,而不会继续执行断言Predicate,从而避免空指针。

其他的Optional方法也是同理,都会优先判断当前Optional对象里的value是否有值,才会进行后面的逻辑。

orElse() 方法 和 orElseThrow() 方法

两个方法都是用来兜底,当value不存在,才会使用传递过去的形参,否则返回当前Optional的value

以orElse为例,如果当前Optional对象的value不为空,那就返回value值

如果value为空,才返回orElse方法传递过来的参数

具体Demo--2

import java.time.LocalDateTime; import java.util.*; import java.util.function.Function; public class OptionalDemo { public static void main(String[] args) { //假设这是从数据库拿到的数据,数据库返回的就是null Approve app = null; //链式加载,一个个方法依照调用顺序,依次执行 //ofNullable方法 将对象包装成Optional对象,如果传入对象是null,ofNullable会创建一个 Optional.EMPTY对象 Optional.ofNullable(app) .filter(p -> p.getApproveId().equals("approveId-A")) //兜底,如果传入对象为 null,或者filter过滤出来的结果是EMPTY。就会执行orElse()方法 .orElse(new Approve()); // of方法,如果传入对象是null,直接就报空指针,无法执行 orElseThrow()方法 //链式加载,如果在某一步报错,是不会继续执行的 // Object o = Optional.of(null).orElseThrow(() -> new RuntimeException("数据为空")); Approve approve = new Approve(); approve.setApproveId("approveId-A"); approve.setCreateInfo(new CreateApprove("创建人小胡", LocalDateTime.now())); //定义一个函数式接口 Function<Approve, CreateApprove> function = (p) -> { return p.getCreateInfo(); }; // map 方法会返回一个新的Optional对象 Optional<CreateApprove> opCreate = Optional.of(approve) //保留approveId是approveId-A的 .filter(po -> po.getApproveId().equals("approveId-A")) //提取对象的createInfo信息 // 等价于 .map(po -> po.getCreateInfo()); .map(function); CreateApprove ca = Optional.of(approve) //保留approveId是approveId-A的 .filter(po -> po.getApproveId().equals("approveId-A")) //提取对象的createInfo信息 //等价于 .map(po -> po.getCreateInfo()) .map(Approve::getCreateInfo) //filter() 方法过滤之后没拿到 approve 对象 //或者 map() 提取到的 createInfo 是 null //就会触发 orElseThrow() 方法抛出异常,如果有数据,就不会抛异常,则返回value .orElseThrow(() -> new RuntimeException("获取数据为空")); } }

map()方法

map方法最后也是调了ofNullable方法,如果有值,则会创建新的Optional对象,如果为null,就会返回全局唯一的那个空Optional实例。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/4 22:33:03

直播预告|如意玲珑:Linux 跨发行版包管理器解析

“一场直面 Linux 依赖地狱的技术拆解直播” 在 Linux 世界里&#xff0c;依赖冲突、环境不一致、跨发行版分发困难&#xff0c;几乎是每个开发者都绕不开的问题。 软件包能不能做到“一次构建&#xff0c;多发行版运行”&#xff1f; 系统环境和应用运行环境&#xff0c;真的可…

作者头像 李华
网站建设 2026/5/1 11:55:33

打造AI智能”成语接龙“游戏

目录 一、项目背景与技术选型 1. 需求分析 2. 技术栈选择 二、系统架构与核心模块设计 1. 后端核心模块&#xff1a;游戏逻辑类&#xff08;IdiomGame&#xff09; &#xff08;1&#xff09;初始成语生成&#xff08;generate_initial_idiom&#xff09; &#xff08;2…

作者头像 李华
网站建设 2026/5/4 18:10:42

【课程设计/毕业设计】基于springboot的学生网上选课系统的设计与实现基于springboot的学生选课管理系统的设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/3 10:30:20

2026年AI模板生成PPT工具排行榜【综合实测】

2026年AI模板生成PPT工具排行榜&#xff08;ChatPPT领衔&#xff09; 一、ChatPPT模板生成的核心优势与特性 ChatPPT作为模板生成PPT领域的绝对领导者&#xff0c;以其9.6分综合评分&#xff08;满分10分&#xff09;和40万本土商务模板库&#xff0c;构建了不可逾越的技术与…

作者头像 李华
网站建设 2026/5/1 6:28:34

批处理界面:echo 输出的前景色和背景色

在 Windows 批处理&#xff08;.bat&#xff09;文件中&#xff0c;可以使用 ANSI 控制码来设置 echo 输出的前景色和背景色。这些控制码以 ESC 字符&#xff08;ASCII 码 27&#xff09;开头&#xff0c;通常表示为 &#xff08;在文本中为了显示方便&#xff0c;我们用 表示 …

作者头像 李华
网站建设 2026/5/3 6:30:11

孩子近视了,可以选择哪些防控办法

当下儿童近视的发生概率在逐年提升&#xff0c;不少家长发现孩子看东西眯眼、频繁揉眼睛&#xff0c;到眼科机构检查后确诊近视&#xff0c;心里满是焦虑&#xff0c;脑海里第一个问题就是&#xff1a;孩子近视了&#xff0c;到底该选哪些靠谱的防控办法&#xff1f;毕竟近视一…

作者头像 李华