news 2026/4/11 1:50:06

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/3/31 3:56:11

Java计算机毕设之基于javaee的超市外卖系统的设计与实现具备用户、商家、骑手管理(完整前后端代码+说明文档+LW,调试定制等)

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

作者头像 李华
网站建设 2026/4/10 4:05:51

计算机Java毕设实战-基于springboot的物业管理系统的设计与实现业主管理、设施维护、报修处理、缴费查询和社区活动【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华
网站建设 2026/4/1 1:29:28

Java毕设选题推荐:基于spring boot的学生选课课程系统的设计与实现基于springboot的学生选课管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

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

作者头像 李华
网站建设 2026/3/27 10:18:52

量子机器学习开发入门:软件测试从业者指南

‌‌1. 量子机器学习基础&#xff1a;测试视角的核心概念‌ 量子机器学习&#xff08;QML&#xff09;融合量子计算与经典机器学习&#xff0c;通过量子态叠加和纠缠加速数据处理&#xff0c;但引入了概率性输出和噪声依赖等新挑战。对测试从业者而言&#xff0c;需优先理解&a…

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

基于Hadoop的网络舆情数据分析系统[python]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着互联网的迅速发展&#xff0c;网络舆情数据呈现出爆炸式增长。基于Hadoop的网络舆情数据分析系统能够高效处理海量舆情数据&#xff0c;挖掘其中有价值的信息。本文详细阐述了该系统的设计与实现&#xff0c;包括系统架构、数据处理流程、功能模块等。通过…

作者头像 李华