【Java踩坑笔记】48_用Optional消灭NPE,但别把它当万能药

发布时间:2026/10/4 5:45:37

【Java踩坑笔记】48_用Optional消灭NPE,但别把它当万能药
48 | 用 Optional 消灭 NPE但别把它当万能药摘要Optional的设计目的是让返回值可能为空这件事显式化而不是消灭所有null。滥用Optional反而让代码更难读。一、问题现象// ❌ 滥用把 Optional 当字段类型classUser{privateOptionalStringemail;// 不推荐}// ❌ 滥用把 Optional 当方法参数publicvoidprocess(OptionalOrderorder){...}// 不推荐正确用法Optional只适合作为返回类型告诉调用方可能没有值。二、踩坑现场场景 1用Optional.get()不判断// ❌ 错误和直接 null 判断没区别OptionalUseruseruserService.findById(1L);Useruuser.get();// ❌ 如果是 empty抛 NoSuchElementException场景 2为了用 Optional 而用// ❌ 不推荐多此一举OptionalStringnameOptional.ofNullable(user.getName());if(name.isPresent()){Stringnname.get();}// ✅ 直接判断反而更清晰if(user.getName()!null){Stringnuser.getName();}三、正确写法3.1 作为返回类型推荐// ✅ 正确返回值用 Optional显式告诉调用方可能为空publicOptionalUserfindById(Longid){UseruseruserMapper.selectById(id);returnOptional.ofNullable(user);// 可能为空}// 调用方OptionalUseruserOptuserService.findById(1L);userOpt.ifPresent(u-process(u));// 有值才处理3.2 提供默认值// ✅ orElse() — 无论是否有值都执行括号里的代码StringnameOptional.ofNullable(user.getName()).orElse(未知);// ✅ orElseGet() — 只有没值时才执行推荐StringnameOptional.ofNullable(user.getName()).orElseGet(()-getDefaultName());// 区别orElseGet 是懒加载有值时不会调 getDefaultName()3.3 链式调用// ✅ 推荐链式调用代码清晰StringcityOptional.ofNullable(user).map(User::getAddress).map(Address::getCity).orElse(未知);// 中间任何一步为 null都返回 未知不会 NPE四、最佳实践✅ Optional 使用的 4 条铁律只作为返回类型不要作为字段类型或方法参数不要用get()而不判断用isPresent()或ifPresent()链式调用map/flatMap/filter是 Optional 最优雅的用法orElseGet()比orElse()好懒加载不浪费计算 不要用 Optional 的场景场景推荐写法字段类型直接用原类型JPA/Hibernate 不支持 Optional 字段方法参数直接用原类型多个参数用 Builder集合类型用空集合Collections.emptyList()不用OptionalList五、小结Optional只适合做返回类型显式表达可能为空不要当字段类型或方法参数用链式调用是 Optional 最优雅的用法map/flatMap/filterorElseGet()比orElse()好懒加载调用get()前必须用isPresent()判断下一篇预告序列化版本号 serialVersionUID 不写会怎样—— 不写 JVM 会自动生成但不同 JVM 实现可能不一样反序列化会失败。

相关新闻

MATLAB的5种取整操作总结

MATLAB的5种取整操作总结

2026/9/30 17:27:15

floor:向负无穷方向取整 如:floor(-1.1) -2; floor(1.9) 1; floor(1.1) 1; floor(-1.9) -2 ceil:向正无穷方向取整 如:ceil(-1.1) -1; ceil(1.9) 2; ceil(1.1) 2; ceil(-1.9) -1 fix:向零方向取整&#xff0c…

从零到实战:手把手教你玩转均线交叉策略

从零到实战:手把手教你玩转均线交叉策略

2026/10/1 3:17:17

作 者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:做了多年量化,踩过无数坑。今天我把均线交叉策略最核心的东西掏出来:SMA、EMA、WMA这三种算法怎么选?短期和长期参数到底怎么配?信号准确率怎么算?这篇文章不讲虚的,代码直接给,逻辑掰开揉碎讲清楚。…

OpenClaw 2.6.4 Windows部署避坑指南:四层验证法实战

OpenClaw 2.6.4 Windows部署避坑指南:四层验证法实战

2026/10/1 23:18:56

1. 项目概述:这不是一个普通软件安装,而是一次Windows环境下的“AI代理运行时”部署实战 OpenClaw 2.6.4 不是传统意义上的桌面应用,它本质上是一个轻量级、面向本地化部署的AI工具链调度器——你可以把它理解成一个“AI技能执行中枢”&#…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/29 22:00:59

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/10/2 14:34:27

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/30 20:35:38

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/10/3 15:21:17

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/10/4 5:19:11

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/30 8:20:32

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…