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

使用Optional优雅处理Null检查

传统方式与Optional对比

传统if-else方式

if(jsonNode != null) {JsonNode appIdNode = jsonNode.get("appId");if(appIdNode != null) {return appIdNode.asText();}
}
return "default";

使用Optional方式

return Optional.ofNullable(jsonNode).map(x -> x.get("appId")).map(JsonNode::asText).orElse("default");

Optional核心用法详解

1. ofNullable()方法

// 安全创建Optional对象,允许传入null值
Optional.ofNullable(可能为null的对象)// 错误示例 - 如果obj为null会抛出NPE
Optional.of(obj) 

2. map()方法链式调用

// 多级属性访问安全示例
String result = Optional.ofNullable(person).map(Person::getAddress).map(Address::getCity).orElse("Unknown");// 等价于:
String city = null;
if(person != null) {Address address = person.getAddress();if(address != null) {city = address.getCity();}
}
city = city != null ? city : "Unknown";

3. 常用终端操作

方法描述
orElse(T)为空时返回默认值
orElseGet(Supplier)延迟计算默认值
orElseThrow()为空时抛出异常
ifPresent(Consumer)值存在时执行操作

最佳实践指南

  1. 避免在Optional内部调用可能NPE的方法

    // 错误 ❌
    Optional.ofNullable(jsonNode.get("appId"))// 正确 ✅
    Optional.ofNullable(jsonNode).map(x -> x.get("appId"))
    
  2. 多级属性访问模式

    // 安全的多级属性访问
    String displayName = Optional.ofNullable(application).map(Application::getIcon).map(Icon::getDisplayName).orElse("default");
    
  3. 集合操作结合

    // 安全处理可能为null的集合
    List<String> names = Optional.ofNullable(users).orElse(Collections.emptyList()).stream().map(User::getName).collect(Collectors.toList());
    
  4. 与Java 8 Stream结合

    // 安全处理嵌套集合
    List<String> emails = Optional.ofNullable(company).map(Company::getDepartments).orElse(Collections.emptyList()).stream().flatMap(dept -> Optional.ofNullable(dept.getEmployees()).orElse(Collections.emptyList()).stream()).map(Employee::getEmail).filter(Objects::nonNull).collect(Collectors.toList());
    

性能考虑

  1. Optional会创建额外对象,在性能敏感场景慎用
  2. 简单null检查使用普通if判断可能更高效
  3. 对于高频调用的方法,考虑缓存Optional对象

常见错误

  1. 错误调用Optional.of()

    // 如果obj可能为null,应该用ofNullable
    Optional.of(obj.getSomething()); // 可能NPE
    
  2. 不必要的嵌套

    // 不推荐
    Optional.ofNullable(Optional.ofNullable(obj).orElse(defaultObj))// 推荐
    Optional.ofNullable(obj).orElse(defaultObj)
    
  3. 误用isPresent()

    // 不推荐
    if(optional.isPresent()) {return optional.get();
    }// 推荐
    return optional.orElse(defaultValue);
    

Optional为Java开发者提供了更优雅的null安全处理方式,合理使用可以使代码更简洁、更安全。

http://www.xdnf.cn/news/2768.html

相关文章:

  • 赋能航天教育:高校卫星仿真教学实验平台解决方案
  • Github两种鉴权模式PAT与SSH
  • CMU-15445(1)——环境搭建
  • python上测试neo4j库
  • 注意力机制:从 MHA、MQA、GQA、MLA 到 NSA、MoBA
  • Mysql索引
  • LeetCode【剑指offer】系列(动态规划篇)
  • VBA快速创建Excel中数据模型的数据连接
  • C++ 部署的性能优化方法
  • 网络拓扑模型相关题目-1
  • Lustre/Scade 语言时序算子与形式化验证的联系
  • 从暴力到优化:解决「分数严格小于k的子数组数目」问题
  • 硬件加密+本地部署,大模型一体机如何打造AI安全护城河?
  • terraform plan和apply的区别
  • 声纹监测技术在新能源汽车的应用场景解析
  • Volcano 进阶实战 (三) - (多集群 / 离线混部)调度
  • windows程序转鲲鹏服务器踩坑记【持续更新中】
  • 如何在WordPress网站中设置双重验证,提升安全性
  • Leetcode594.最长和谐子序列
  • 小米云服务安卓版数据同步稳定性与安全性能测评
  • 安卓基础(接口interface)
  • 模板--进阶
  • 提高营销活动ROI:大数据驱动的精准决策
  • 使用 Electron 打包 Windows 可执行程序
  • Darvas Box黄金交易算法详解:基于XAU/USD的实战应用
  • 武装Burp Suite工具:APIKit插件_接口安全扫描.
  • 算法备案材料拟公示内容涉及什么?如何撰写?
  • opendds的配置
  • IDEA2022.3开启热部署
  • 第16节:传统分类模型-支持向量机(SVM)在图像分类中的应用