news 2026/4/17 0:21:29

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/4/16 19:13:50

光伏并网发电系统MATLAB/Simulink仿真设计探索

光伏并网发电系统MATLAB/Simulink仿真设计。 该仿真包括电池&#xff0c;BOOST升压电路&#xff0c;单相全桥逆变电路&#xff0c;电压电流双闭环控制部分&#xff1b;应用MPPT技术&#xff0c;提高光伏发电的利用效率。 采用PI调节方式进行闭环控制&#xff0c;采用定步长扰动…

作者头像 李华
网站建设 2026/4/15 21:26:54

山东菏泽案例:农业AI测试的意外红利

农业AI测试的崛起背景 在数字化转型浪潮中&#xff0c;软件测试行业正经历由AI驱动的革命性变革。山东菏泽&#xff0c;这座以农业闻名的三四线城市&#xff0c;意外成为AI测试技术落地的“试验田”。当地测试从业者通过AI工具&#xff08;如智能用例生成和自愈脚本&#xff0…

作者头像 李华
网站建设 2026/4/16 22:57:36

单轴无限3D打印熔融堆积成型装置设计与实现

单轴无限3D打印熔融堆积成型装置设计与实现 一、设计背景与意义 熔融堆积成型&#xff08;FDM&#xff09;技术凭借成本低廉、材料兼容性强等优势&#xff0c;广泛应用于产品研发、定制化生产等领域&#xff0c;但传统FDM设备受限于XYZ三轴结构&#xff0c;存在打印长度有限、…

作者头像 李华
网站建设 2026/4/16 19:35:44

计算机Java毕设实战-基于javaee的超市外卖系统的设计与实现基于springboot的超市外卖商城系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

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

作者头像 李华