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

发布时间:2026/7/16 23:50:56

【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/7/16 23:50:56

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/7/16 23:50:56

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

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

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

2026/7/16 23:50:56

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

惠普电脑原厂系统安装与优化全指南

惠普电脑原厂系统安装与优化全指南

2026/7/17 1:21:00

1. 惠普电脑原厂系统安装全攻略惠普暗影精灵、光影精灵和星系列笔记本电脑出厂时都预装了正版Windows系统及专属优化驱动,但很多用户在使用过程中会遇到系统崩溃、运行缓慢或误删系统文件的情况。不同于普通Windows安装,原厂预装版系统包含了针对特定机型…

游戏模组制作解析:从资源替换到机制融合的技术实践

游戏模组制作解析:从资源替换到机制融合的技术实践

2026/7/17 1:21:00

在实际游戏开发或玩家社区中,经常会遇到一些由爱好者或社区开发者制作的游戏模组(Mod)。这些模组往往在原版游戏的基础上,融合了新的角色、关卡、机制或美术资源,为玩家带来全新的体验。本文将以一个社区热议的《植物大…

Windows 8.1安装与优化全指南

Windows 8.1安装与优化全指南

2026/7/17 1:21:00

1. 项目概述:Windows 8.1安装全流程解析2014年发布的Windows 8.1作为微软承前启后的操作系统,其安装过程与后续配置对系统稳定性影响深远。这个教程将带您完整复现当年的安装场景,特别针对当前用户最关心的更新管理问题提供解决方案。不同于简…

Windows系统日志SrtTrail.txt解析与故障排查指南

Windows系统日志SrtTrail.txt解析与故障排查指南

2026/7/17 1:21:00

1. 文件路径解析:Windows系统日志的隐秘角落当你的Windows系统突然蓝屏或意外重启后,是否好奇过操作系统如何记录这些故障信息?在C:\WINDOWS\System32\Logfiles\Srt\路径下,有一个名为SrtTrail.txt的日志文件,它就像系…

Windows平台Dolby Atmos永久激活与音效优化指南

Windows平台Dolby Atmos永久激活与音效优化指南

2026/7/17 1:21:00

1. 杜比全景声(Dolby Atmos)技术解析杜比全景声是近年来音频技术领域的重要突破,它彻底改变了传统环绕声的平面声场概念。与传统的5.1或7.1声道系统不同,Atmos引入了"音频对象"的概念,允许声音工程师将特定音…

UWB室内厘米级定位MATLAB全流程实现:从原始测距到融合定位与精度评估

UWB室内厘米级定位MATLAB全流程实现:从原始测距到融合定位与精度评估

2026/7/17 1:10:59

本文还有配套的精品资源,点击获取 简介:这套MATLAB代码包完整复现UWB室内高精度定位的整个技术链路,直接处理原始UWB测距数据,支持视距(LOS)识别、测距参数标定、多基站三角定位(含两种解算方…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/16 0:35:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/16 14:29:31

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/16 14:18:17

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

2026/7/17 0:00:57

更多请点击: https://intelliparadigm.com 第一章:Cursor终端插件生态避坑指南概览 Cursor 作为基于 VS Code 内核构建的 AI 原生编辑器,其终端插件生态虽活跃,但存在兼容性断层、权限策略突变与调试链路断裂等典型风险。开发者常…

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

2026/7/17 0:00:57

更多请点击: https://codechina.net 第一章:ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表) 提示词工程已从经验试错迈入变量驱动的科学阶段。实证研究表明,影响…

DeepSeek V4替换Codex底座模型的实践与优化

DeepSeek V4替换Codex底座模型的实践与优化

2026/7/17 0:00:57

1. 为什么选择用DeepSeek V4替换Codex的底座模型去年我在开发一个智能代码补全工具时,发现Codex的默认底座模型在复杂业务逻辑场景下表现不尽如人意。经过多次测试对比,DeepSeek V4在以下几个关键指标上展现出明显优势:代码补全准确率&#x…