专栏名称: Java基基
一个苦练基本功的 Java 公众号,所以取名 Java 基基
目录
相关文章推荐
贵州日报  ·  遵义市最新人事任免 ·  5 小时前  
贵州日报  ·  省委常委会召开会议 徐麟主持并讲话 ·  8 小时前  
百姓关注  ·  网红"罗大美"家人称嫌疑人当庭翻供!坚称过失 ... ·  11 小时前  
贵州日报  ·  说好的大太阳呢?据说等哈就来 ·  昨天  
贵州日报  ·  黔南州最新人事 ·  2 天前  
51好读  ›  专栏  ›  Java基基

到底选谁?Java判断null,Optional和工具类真香?还是if(obj == null)更靠谱?

Java基基  · 公众号  ·  · 2025-01-24 22:44

正文

👉 这是一个或许对你有用 的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入 芋道快速开发平台 知识星球。 下面是星球提供的部分资料:

👉 这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、 商城 、支付、工作流、大屏报表、微信公众号、 ERP CRM AI 大模型 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本

来源:juejin.cn/post/
7409467432900427827


背景描述

最近在开发项目时,我遇到了一个需要从 Hyperlink 对象中获取 link 属性的小需求。这个过程中我需要判断 Hyperlink 对象是否为 null,以防止出现空指针异常。面对这种情况,有两种常见的处理方式。

一种是使用 Optional.ofNullable() 方法,另一种则是使用传统的 null 检查。这两种方法分别对应以下代码片段:

// 通过Optional.ofNullable()判断是否为null
String link = Optional.ofNullable(hyperlink)
        .map(Hyperlink::getLink)
        .orElse(null);
        
// 传统方法判断是否为null
String link = hyperlink != null ? hyperlink.getLink() : null;

那么,在这种情况下,究竟该选择哪一种方法来判断 null 值更合适呢?

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

代码分析

两段代码都能够实现从 Hyperlink 对象获取 link 属性,并防止出现空指针异常( NullPointerException )。我们可以从代码风格、可读性和性能多个角度进行分析。

1、使用 Optional.ofNullable()

String link = Optional.ofNullable(hyperlink)
        .map(Hyperlink::getLink)
        .orElse(null);

这种方法使用了 Optional.ofNullable() ,结合 map() 来处理可能的 null 值。它的优势在于:

  • 简洁优雅: 链式调用的方式使代码更加简洁,容易理解,尤其适合团队已经熟悉并经常使用 Optional 的情况。
  • 防止空指针异常: Optional 是一种现代化的编程风格,能有效避免空指针异常,特别适用于复杂的嵌套检查。

然而,Optional 的底层实现涉及包装和解包操作,在高频调用场景下可能会带来一定的性能开销。此外,如果团队中有些成员不熟悉 Optional,可能需要额外的学习成本。

2、使用传统的 null 检查

String link = hyperlink != null ? hyperlink.getLink() : null;

使用传统的三元运算符直接判断 null,这种方式的优势包括:

  • 易于理解: 这种写法简单直观,几乎不需要解释,特别适合那些对 Optional 不熟悉的团队成员。
  • 性能更优: 直接的 null 检查避免了 Optional 的包装和解包操作,性能上会稍好,尤其在对性能要求较高的场景下更具优势。

具体选择哪种方式,取决于项目的实际情况,这里提供一些建议:

  • 项目要求: 如果项目对性能有严格要求或团队不熟悉 Optional,那么传统的 null 检查更为合适。
  • 团队代码风格: 我觉得到底怎么用,还是要看项目,项目用啥咱们就用啥,不要特立独行,如果项目有硬性要求,就按照要求来;如果没有要求,就参考之前的代码风格;如果是新项目,可以使用第二段代码,这么简单易懂,写起来肯定没错。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

拓展:空集合判断

在 Java 开发中,判断集合是否为空是一个非常常见的操作。通常有两种方式可以实现这一点:

  • 使用原生方法: list == null || list.isEmpty()
  • 使用工具类方法,如 Spring 的 CollectionUtils.isEmpty() Apache Commons Lang3 CollectionUtils.isEmpty()

那么,究竟哪一种方法更好呢?在大多数情况下,我更建议使用第一种原生方法,原因如下:

1、更简洁直观

使用 list == null || list.isEmpty() 的写法更加直观易懂,符合大多数人的代码风格。它不依赖任何外部库,只使用了 Java 原生的集合操作方式。因此,在不需要大量使用 Spring 或其他第三方库的场景下,这种方法更加适合。

如果代码需要在不同项目中复用或发布为公共类库,选择原生方法可以减少对外部库的依赖,使代码更容易维护和移植。

2、减少依赖外部库

CollectionUtils.isEmpty() 是 Spring 或 Apache Commons Lang3 中提供的工具类方法。尽管这些工具类在大型项目中非常有用,但在某些场景下,减少对外部库的依赖显得尤为重要。

例如,在一个不广泛使用 Spring 的项目中,使用 Java 原生方法可以让代码更独立,降低对外部库的耦合度。如果项目需要减少 Spring 的依赖,选择原生方法无疑是更好的做法。







请到「今天看啥」查看全文