Java如何优雅的进行判空

这篇具有很好参考价值的文章主要介绍了Java如何优雅的进行判空。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、前言

实际项目中我们会有很多地方需要判空校验,如果不做判空校验则可能产生NullPointerException异常。

针对异常的处理我们在上一篇有提及:

先来看一下实际项目中一些判空方式

java判断空值和null值,java,jvm,servlet

java判断空值和null值,java,jvm,servlet

通常我们判断一个对象是否为Null,可以使用java.util中的Objects.nonNull(obj)、hutool中的ObjectUtil或者直接 null != obj

2、List的判空

像List这种比较特殊的在项目中可能不仅仅是判断非空了。对于List来说不等于null和List.size()不等于0是两回事,公司也有实习生常常有把这两个混淆的情况,list不等于null说明已经初始化了,堆内存中有一块属于它的地盘,而size为0说明还没往里面放东西,举个例子说就是不等于null代表我现在有个瓶子,size大于0说明我向瓶子里装水了。

实际项目中也发现有直接用list.isEmpty()去判断的,来看一下源码:

java判断空值和null值,java,jvm,servlet

相当于判断瓶子里有没有水(前提是瓶子已经存在,若瓶子不存在,则会抛出NullPointerException异常)。

所以通常情况下会连用list != null && list.size > 0 来判断,或者直接使用HuTool中CollUtil工具的isEmpty。诸如此类的还有Set、Map等

3、String的判空

这里还是用瓶子与水的概念,String为null时调用equals(String) 或 length() 等操作抛出 java.lang.NullPointerException。

java判断空值和null值,java,jvm,servlet

针对字符串判空有以下几种方式:

1、大多数人使用的方法之一,直观,方便,但效率低下:

if(a == null || a.equals(""));

2、比较字符串长度,高效:

if(a == null || a.length() == 0);

3、Java SE 6.0 才刚刚开始提供,效率和方法二差不多:

if(a == null || a.isEmpty());

当然还可以使用org.apache.commons.lang.StringUtils工具。

StringUtils.isNotBlank(a);

* StringUtils.isNotBlank(null) = false

* StringUtils.isNotBlank("") = false

* StringUtils.isNotBlank(" ") = false

* StringUtils.isNotBlank("bob") = true

* StringUtils.isNotBlank(" bob ") = true

该工具类中还有个isNotEmpty()方法,从注释可以很明显看出二者的差别

StringUtils.isNotEmpty(a);

* StringUtils.isNotEmpty(null) = false

* StringUtils.isNotEmpty("") = false

* StringUtils.isNotEmpty(" ") = true

* StringUtils.isNotEmpty("bob") = true

* StringUtils.isNotEmpty(" bob ") = true

4、Optional

Optional的出现就是用来防止NullpointException的。常见的方法有:

  • .empty():创建一个空的Optional实例
  • .of(T t) : 创建一个Optional 实例,为null时报异常
  • .ofNullable(T t):若t 不为null,创建Optional 实例,否则创建空实例
  • isPresent() : 判断容器中是否有值
  • ifPresent(Consume lambda) :容器若不为空则执行括号中的Lambda表达式
  • orElse(T t) : 获取容器中的元素,若容器为空则返回括号中的默认值
  • orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回s 获取的值
  • orElseThrow() :如果为空,就抛出定义的异常,如果不为空返回当前对象
  • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
  • flatMap(Function mapper):与map 类似,要求返回值必须是Optional
  • T get() :获取容器中的元素,若容器为空则抛出NoSuchElement异常

先看个常见的示例:

baseInfo类中有布尔类型的属性,是空返回false,不为空取其值,需要四行。

java判断空值和null值,java,jvm,servlet

当使用Optional时,一行搞定,非常的优雅。

java判断空值和null值,java,jvm,servlet

4.1 Optional对象的创建

public final class Optional<T> {
    private static final Optional<?> EMPTY = new Optional<>();
    private final T value;
    //可以看到两个构造方格都是private 私有的
    //说明 没办法在外面new出来Optional对象
    private Optional() {
        this.value = null;
    }
    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }
    //这个静态方法大致 是创建出一个包装值为空的一个对象因为没有任何参数赋值
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
    //这个静态方法大致 是创建出一个包装值非空的一个对象 因为做了赋值
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
    //这个静态方法大致是 如果参数value为空,则创建空对象,如果不为空,则创建有参对象
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
}
复制代码

4.2使用场景

场景1:在service层中 查询一个对象,返回之后判断是否为空并做处理

java判断空值和null值,java,jvm,servlet

场景2:使用Optional 和函数式编程,一行搞定

java判断空值和null值,java,jvm,servlet

5、总结

每种方法的存在必然有适用的场景,有些情况下这种链式编程,虽然代码优雅了。但是,逻辑性没那么明显,可读性有所降低,大家项目中看情况酌情使用。文章来源地址https://www.toymoban.com/news/detail-703455.html

到了这里,关于Java如何优雅的进行判空的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 判空的常见方法

    另外,Guava 库还提供了一个更方便的方法,使用方式如下: 简单,但需要写太多代码判断,会显得有些麻烦。或 使用 Apache Commons Lang3 提供的 判断字符串是否为空或者只包含空格字符。这种方式使用起来非常方便: 还可采用  Java 8 引入的  String#isEmpty()  方法判断字符串是

    2024年02月04日
    浏览(25)
  • 日常BUG —— Java判空注解

    😜 作           者 :是江迪呀 ✒️ 本文 : 日常BUG 、 BUG 、 问题分析 ☀️ 每日   一言 : 存在错误说明你在进步! 在使用Java自带的注解 @NotNull 、 @NotEmpty 、 @NotBlank 时报错,报错内容如下: 上述的注解添加后并不生效。 使用上述注解加到了不正确的数据类型

    2024年02月13日
    浏览(42)
  • 如何在 容器中 优雅的 运行 java 应用

    当需要运行Java应用时,不管在机器上还是容器里,一般的做法是运行 java 命令。 java -jar /opt/app.jar 即可 如果是多多jar 文件的只需用到 java -cp lib/* com.example.Main 定类路径(classpath)和入口 Java 类即可。 但 在构建容器镜像时,一般使用 Dockerfile 的 ENTRYPOINT 来指定运行的 java 命

    2024年02月15日
    浏览(38)
  • 技术扫盲:如何优雅的使用 java -jar

    java -jar xxx.jar java -jar 是一个用于在命令行界面中执行 Java 可执行 JAR 文件的命令。它的语法如下: 其中: java 是 Java 运行时环境的可执行文件。 -jar 是一个选项,表示要执行的文件是一个 JAR 文件。 JAR 文件路径 是要执行的 JAR 文件的路径。 [参数] 是可选的命令行参数,用于

    2024年02月03日
    浏览(36)
  • Java Stream流排序并判空

    问题:直接排序的话会出现NullPointerException所以需要排空 解决:使用nullsFirst()或者/nullsLast() 方法介绍 nullsFirst():此方法返回比较器,其是空型比较,并认为空值小于非空。null首先通过以下逻辑进行操作: nullsLast():方法返回比较器,其是空型比较,并认为比非空更大空值。

    2024年02月21日
    浏览(31)
  • JVM安全退出(如何优雅的关闭java服务)

    上线!重启!你还在为丢失任务而烦恼么?看这里看这里,从此不再丢任务,JVM可以安全退出的 在交易流程中,为了提升服务的性能,我们做了一些异步化的优化,比如更新用户最近使用的收货地址、提单完成后通过MQ去发送各种通知类消息、清理用户的购物车等等这些操作,

    2024年03月22日
    浏览(45)
  • Java中如何优雅的把Map转为对象

    在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,而且用起来也还算方便,比如像fastJson就可以轻松实现map和对象的互转,但这里,我想通过反射的方式对他们做转化,也算是对反射的学习

    2024年02月13日
    浏览(38)
  • java spring boot 字符串判空

    1、安装依赖 2、用法 2.1 StringUtils.isNotBlank():判断参数是否不为空 2.2 StringUtils.isBlank():判断是否为空,长度是否为0,值是否包含空白字符 2.3 StringUtils.isEmpty() 2.4 StringUtils.isNotEmpty():

    2024年02月08日
    浏览(33)
  • 如何优雅地单元测试 Kotlin/Java 中的 private 方法?

    翻译自 https://medium.com/mindorks/how-to-unit-test-private-methods-in-java-and-kotlin-d3cae49dccd ❓如何单元测试 Kotlin/Java 中的 private 方法❓ 首先,开发者应该测试代码里的 private 私有方法吗? 直接信任这些私有方法,测试到调用它们的公开方法感觉就够了吧。 对于这个争论,每个开发者都会

    2024年02月06日
    浏览(39)
  • java怎么对对象的每一个字段都判空?

    可以通过反射机制,对 Java 对象中的每一个字段进行判空操作 我们定义了一个  isObjectFieldsNull  方法,该方法接受一个 Java 对象作为参数,使用反射机制遍历该对象中的每一个字段,如果有任何一个字段不为空,则返回  false ;如果所有字段都为空,则返回  true 。 需要注意

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包