当前位置: 首页 > news >正文

Java Lambda + 空指针四种主流处理方案

Lambda 开发最容易 NPE:集合为空、元素为 null、字段为 null,

常用四种:if判空、Optional、Stream过滤、函数式空安全

优先用 Optional + Stream,替代大量 if,符合 Lambda 函数式思想。

一、方案 1:传统 if 判空(不推荐在 Lambda 大量使用,过渡)

原理

提前 null 判断再执行逻辑,最原始。

User user = null; if(user != null){ System.out.println(user.getName()); }

缺点:代码臃肿,链式流式代码中割裂 Lambda 风格,大量 if 重复造轮子。

适用:简单单行代码,流式处理禁用

二、方案 2:Optional(Lambda 标配,首选,JDK8)【重点背诵】

核心定位

容器对象,用来封装可能为 null 的值,杜绝显式 if==null,函数式处理空,配合 Lambda

四个核心 API(必背 4 个)

  1. Optional.ofNullable(obj):可以传 null(日常 99% 用)
  2. Optional.of(obj):入参不能 null,空直接 NPE
  3. orElse(默认值):为空返回默认值
  4. orElseGet(Supplier):为空执行 Lambda 生成默认(懒加载,性能优)
  5. orElseThrow():空抛异常
  6. map(Function):安全获取嵌套属性(解决多层对象空指针,重中之重)
  7. ifPresent(Consumer):非空才执行 Lambda 逻辑

实战 1:普通对象空安全

User user = null; // 非空执行打印 Optional.ofNullable(user).ifPresent(u-> System.out.println(u.getName())); // 空给默认对象 User defUser = Optional.ofNullable(user).orElse(new User("默认")); // Lambda懒创建默认(推荐) User user2 = Optional.ofNullable(user).orElseGet(()->new User());

实战 2:多层对象(最经典,解决连环 NPE)

// user→Address→city,多层任意一层null都不报错 String city = Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .orElse("未知城市");

map 特点:中间任意返回 null,后续 map 不再执行,直接走到 orElse。

实战 3:空则抛异常

User u = Optional.ofNullable(user).orElseThrow(()->new RuntimeException("用户不存在"));

Optional 使用口诀

ofNullable 包对象,map 逐层拿属性;ifPresent 非空执行,orElse 兜底默认值。

三、方案 3:Stream filter 过滤 null(集合遍历 Lambda 空处理,高频)

场景:List 集合中元素为 null / 对象字段为 null

filter(Objects::nonNull)过滤空元素,再执行后续 map/forEach。

List<User> userList = Arrays.asList(null,new User("张三"),null,new User("李四")); // 过滤null元素,再Lambda处理 userList.stream() .filter(Objects::nonNull) // 剔除集合里null元素 .forEach(u-> System.out.println(u.getName())); // 字段为空过滤 userList.stream() .filter(Objects::nonNull) .filter(u->u.getName()!=null) .map(User::getName) .collect(Collectors.toList());

拓展:Objects.nonNull()/isNull()JDK8 工具方法,Lambda 筛选标配。

四、方案 4:函数式默认值 + 三元(简单字段兜底)

搭配 Lambda、Stream map 中兜底

// 字段为空返回默认字符串 List<String> names = userList.stream() .filter(Objects::nonNull) .map(u->u.getName()==null ? "无名":u.getName()) .collect(Collectors.toList());

五、四种方案选型对比(背诵)

表格

方案适用场景优点缺点
if 判空简单零散代码易懂破坏流式 Lambda,代码冗余
Optional单个对象、多层级属性获取链式优雅、函数式、无 if不能直接处理集合
Stream filter集合批量处理批量过滤空,流式一体化只管集合元素,不适合单个对象
三元表达式单个字段快速兜底极简多层嵌套可读性差

项目统一规范(工作落地)

  1. 单个 POJO、多级属性:统一用 Optional.map ()
  2. List 集合流式处理:开头 filter (Objects::nonNull)
  3. 简单字段赋值:三元表达式快速兜底
  4. 杜绝大量 if (user!=null)

六、高频综合实战(项目标准写法)

需求:用户列表,过滤空用户、空姓名,获取城市,空城市赋值【未知】

List<String> cityList = userList.stream() .filter(Objects::nonNull) // 剔除null用户 .map(user-> Optional.ofNullable(user.getAddress()).map(Address::getCity).orElse("未知")) .collect(Collectors.toList());

七、易错坑(面试常问)

  1. Optional.of()不能传 null,必 NPE,一律优先ofNullable
  2. orElse:不管空不空,对象提前创建;orElseGet:只有空才创建,资源重对象优先 orElseGet
  3. Optional 是容器,不能用 ==null 判断容器,容器永远非空,空是内部值为空。

八、终极背诵总结

单个对象多层空,Optional 链式 map;集合遍历有空值,Stream filter 先剔除;简单字段缺默认,三元表达式兜底;少写 if 少判空,Lambda 风格要统一。

http://www.jsqmd.com/news/992349/

相关文章:

  • 2026年对辊破碎机厂家实力推荐:徐州市恒力破碎机制造有限公司技术领先与服务保障 - 品牌推荐官
  • 2026年深度除氟剂生产厂家实力推荐:巩义永源技术领先与市场口碑双优之选 - 品牌推荐官
  • _Rust 无GC内存模型深度拆解:手写自定义Arena内存池
  • Android Studio中文界面终极配置指南:3步告别英文困扰
  • Yakit实战入门:从零构建你的第一个安全测试工作流
  • MTKClient终极指南:3步教你拯救变砖的联发科设备
  • PCA9575 I/O扩展芯片实战指南:电平转换、中断与混合电压系统设计
  • Sub-1 GHz射频接收器OL2311寄存器配置实战:从原理到调试
  • 如何用5分钟实现专业级图像分层:Layerdivider智能PSD生成终极指南
  • MPC8572E PowerQUICC III处理器硬件设计实战指南
  • Armadillo 3.4.0 C++线性代数库源码包,带Matlab式语法、跨平台构建脚本与完整示例
  • 2026年湖南职称申报服务推荐:湖南筑励咨询职称论文发表与学历提升全流程支持 - 品牌推荐官
  • PCA9553智能LED驱动芯片:I2C总线上的硬件PWM与GPIO扩展实战
  • 用Python和SymPy搞定汽车二自由度模型:从理论方程到代码仿真(保姆级教程)
  • 从文字到CAD的魔法:零基础5分钟变身机械设计师
  • 如何完整备份QQ空间历史记录:GetQzonehistory开源工具终极指南
  • Anthropic发布Claude Fable 5和Mythos 5:分层发售,能力与价格匹配几何?
  • 我用Claude Code写了2万行核心代码,然后亲手把它们全部删掉了
  • 医药企业花千万建系统,却卡在了这件最基础的事上
  • ViT架构解析:从Transformer到视觉识别的跨界革命
  • MPC8314E高速接口电气特性解析与硬件设计实战
  • 免费开源网络速度测试工具OpenSpeedTest™:3分钟搭建专属测速站
  • 【MATLAB】飞行器姿态快速收敛控制算法实现
  • 低查重AI教材编写利器!AI工具助力,快速生成实用教材
  • 深度测评:餐饮老板怎么评估数字化转型方案的投入产出?
  • 从游戏玩家到电影导演:用League Director打造专业级英雄联盟视频
  • 虚幻引擎资产深度编辑终极指南:UAssetGUI 5大核心特性解析
  • 影刀RPA新手教程_输入文本与模拟输入的区别
  • 实战USG5500防火墙安全域与策略配置:从零构建Trust-DMZ-Untrust访问模型
  • 沈阳苏家屯区防水补漏哪家靠谱?2026正规修缮公司排名实测 - 苏易房屋修缮