Java如何判空

news2024/11/30 14:37:13

目录

前言

List的判空

String的判空

Optional

4.1 Optional对象的创建

4.2使用场景


前言

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

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

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

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

List的判空

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

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

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

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

String的判空

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

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

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

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,不为空取其值,需要四行。

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

4.1 Optional对象的创建

4.2使用场景

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);
    }
}

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

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

借鉴:稀土掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523247.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV实战(23)——相机标定

OpenCV实战&#xff08;23&#xff09;——相机标定 0. 前言1. 数字图像成像原理2. 相机标定2.1 执行相机校准2.2 使用已知相机参数校准2.3 使用圆网格进行校准 3. 完整代码小结系列链接 0. 前言 我们已经了解了相机如何通过在 2D 传感器平面上投射光线来拍摄 3D 场景&#xf…

使用RobustPCA 进行时间序列的异常检测

鲁棒主成分分析(Robust Principal Component Analysis, RobustPCA)是一种将时间序列矩阵分解为低秩分量和稀疏分量的技术。这种分解能够识别潜在的趋势&#xff0c;以及检测异常和异常值。在本中我们将研究RobustPCA的数学基础&#xff0c;介绍它与传统的PCA之间的区别&#xf…

GcDataViewer for JavaScript 6.1.0 Crack

GcDataViewer是跨平台 JavaScript 数据查看器,使用我们的 JavaScript 数据查看器在 Web 上打开和查看数据文档。 Load Excel &#xff08;XLSX&#xff09;、CSV 和SPREADJS&#xff08;SSJSON&#xff09; 文件&#xff0c;全部在一个查看器中 支持使用排序、筛选器和切片器进…

单词拼写检查textblob模块spellcheck方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 单词拼写检查 textblob模块 spellcheck方法 [太阳]选择题 关于python代码说法错误的一项是&#xff1a; from textblob import Word myWordsuccessfulee print("【显示】myWord …

【Spring事务】Spring事务事件控制,解决业务异步操作

使用背景 在业务中&#xff0c;经常会有这样的需求&#xff0c;在数据库事务提交之后&#xff0c;发送异步消息或者进行其他的事务操作。 例如当用户注册成功之后&#xff0c;发送激活码&#xff0c;如果用户注册后就执行发送激活码&#xff0c;但是在用户保存时出现提交事务…

【利用AI让知识体系化】入门Express框架

思维导图 文章目录 思维导图第一章&#xff1a;介绍Express什么是ExpressExpress优点Express应用场景 第二章&#xff1a;安装和基础用法安装Express搭建第一个Express应用中间件的使用 第三章&#xff1a;路由和控制器路由的原理路由的基本用法路由的进阶用法控制器的使用 第四…

BM 34 判断是否是二叉搜索树

判断是不是二叉搜索树_牛客题霸_牛客网 (nowcoder.com) 二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。 递归去做 &#xff0c;一段一段的去判断是否满足条件 /*** struct TreeNode {* int val;* struct TreeNode *left;* str…

c++ 11标准模板(STL) std::set(二)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

超实用!50+个ChatGPT提示词助你成为高效Web开发者(上)

如果你已经感到编写代码的重复和繁琐让你疲惫不堪&#xff0c;想要提高自己的效率&#xff0c;那么你来对地方了。ChatGPT是一款能够帮助你优化工作流程、减少错误并获得提高代码的见解的强大工具。 在这篇博客文章中&#xff0c;我们将向你提供超过50个提示和策略&#xff0c;…

OpenCV教程——形态学操作。膨胀,腐蚀,开操作,闭操作,形态学梯度,顶帽,黑帽

1.形态学操作 图像形态学操作&#xff1a;基于形状的一系列图像处理操作的合集&#xff0c;主要是基于集合论基础上的形态学数学。 形态学有四个基本操作&#xff1a;膨胀、腐蚀、开、闭。 2.膨胀与腐蚀 2.1.膨胀 跟卷积操作类似&#xff0c;假设有图像A和结构元素B&#…

路径规划算法:基于灰狼优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于灰狼优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于灰狼优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法灰狼…

自媒体的孔雀效应:插根鸡毛还是专业才华?

自媒体时代&#xff0c;让许多原本默默无闻的人找到了表达自己的平台。有人声称&#xff0c;现在这个时代&#xff0c;“随便什么人身上插根鸡毛就可以当孔雀了”。可是&#xff0c;事实真的如此吗&#xff1f; 首先&#xff0c;我们不能否认的是&#xff0c;自媒体确实为大众提…

【大数据】通过 docker-compose 快速部署 Presto(Trino)保姆级教程

文章目录 一、概述二、前期准备1&#xff09;部署 docker2&#xff09;部署 docker-compose 三、创建网络四、Trino 编排部署1&#xff09;下载 trino2&#xff09;配置1、coordinator 配置2、worker 配置 3&#xff09;启动脚本 bootstrap.sh4&#xff09;构建镜像 Dockerfile…

多尺度深度特征(下):多尺度特征学习才是目标检测精髓(论文免费下载)...

计算机视觉研究院专栏 作者&#xff1a;Edison_G 深度特征学习方案将重点从具有细节的具体特征转移到具有语义信息的抽象特征。它通过构建多尺度深度特征学习网络 (MDFN) 不仅考虑单个对象和局部上下文&#xff0c;还考虑它们之间的关系。 公众号ID&#xff5c;ComputerVisionG…

MySQL- 存储引擎

MySQL体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程 池的概念&#xff0c;为通过认证安全接入的客户端…

通过自动装箱和拆箱解释所定义基础数据类型和其对应封装类的区别

文章目录 前言一、拆装箱的实质二、拓展1.数值超过128的Integer装箱2.Java内存分配 前言 在刷软中的时候涉及到了值传递和地址传递传参的区别&#xff0c;其中提到不管是将基础数据类型的变量传值给对象数据类型的变量还是反过来都属于值传递&#xff0c;究其原因就是期间发生了…

【本地模式】第一个Mapreduce程序-wordcount

【本地模式】&#xff1a;也就是在windows环境下通过hadoop-client相关jar包进行开发的&#xff0c;我们只需要通过本地自己写好MapReduce程序即可在本地运行。 一个Maprduce程序主要包括三部分&#xff1a;Mapper类、Reducer类、执行类。 map阶段&#xff1a;将每一行单词提…

XShell远程连接

xshell 是一个强大的安全终端模拟软件&#xff0c;它支持SSH1,SSH2以及microsoft windows 平台的TELNET协议。xshell通过互联网到远程主机的安全连接。 xshell可以在windows界面下来访问远程终端不同系统下的服务器&#xff0c;从而比较好的达到远程控制终端的目的。 步骤一 …

MySQL- 索引

索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外, 数据库系统还维护着满足特定查找算法的数据结构, 这些数据结构以某种方式引用数据, 这样就可以在这些数据结构上实现高级查找算法, 这种数据结构就是索引。 索引结构 MySQL的索引是在存储层实现的, 不同的存储引擎有…

网友总结:面试超过一个小时,通过概率更低;面试时长在半小时以内,通过概率更高!...

面试时长跟通过概率有关系吗&#xff1f; 一位网友分享了自己的求职感想&#xff1a; 面试过程越长&#xff0c;差不多一个小时或者超过一个小时&#xff0c;问得越详细&#xff0c;通过的可能性越低。因为问得越细&#xff0c;说明这个公司越挑&#xff0c;需要候选人匹配度越…