Java如何判空

news/2024/9/12 0:16:55

目录

前言

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 和函数式编程,一行搞定

借鉴:稀土掘金


https://www.xjx100.cn/news/306125.html

相关文章

把Kubernetes用于微服务管理的最佳实践

把Kubernetes用于微服务管理的最佳实践 一、 引言1 什么是 Kubernetes2 Kubernetes 的优势和应用场景3 为什么使用 Kubernetes 部署容器化应用程序 二、 准备工作1 安装 Kubernetes2 准备容器镜像3 准备 Kubernetes 配置文件 三、 部署应用程序1 创建 Kubernetes 命名空间2 创建…

Solidity中的函数和事件

Solidity是一种用于编写智能合约的编程语言&#xff0c;它是以太坊平台上最常用的语言之一。在Solidity中&#xff0c;函数和事件是合约的两个关键组成部分。函数用于定义合约中的行为和逻辑&#xff0c;而事件则用于实现合约与外部应用程序之间的通信和交互。本文将深入探讨So…

【mongoDB】mongodb权限验证 || mongodb重启 || mongodb常用命令

mongodb版本号 6.0 前言 mongoDB刚开始无需密码登录mongoDB有3默认数据库&#xff0c;分别为&#xff1a; admin 超级用户&#xff0c;能对所有数据库操作&#xff0c;执行管理员命令config 分片集群配置的数据库local 分片集群锁信息的集合test 这个数据库一般是隐式创建的&…

辉哥带你学hive第一讲 hive基本介绍以及环境搭建

文章目录 1.Hive介绍1.1 hive 基本情况1.2 Hive架构原理1.3 Hive 安装1.4 元数据配置1.5 hive 服务部署1.6Hive常用交互命令1.6.1 Hive参数配置方式1.Hive介绍 1.1 hive 基本情况 hive基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表。 Hive是一个Hadoop客…

Apache Hive SQL DQL

Hive SQL--DQL-Select select语法树 SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference JOIN table_other ON expr [WHERE where_condition] [GROUP BY col_list [HAVING condition]] [CLUSTER BY col_list | [DISTRIBUTE BY col_list] [SORT BY|…

判断数组为空、含有某值,判断数据类型,判断空对象

&#x1f449;js中判断空数组和空对象的方法_js 空数组_EntheosLee的博客-CSDN博客 &#x1f449;JavaScript判断数组是否为空、 判断数据类型_javascript判断数组为空_webhyx的博客-CSDN博客 &#x1f449;如何判断js数组是否为空_js判断数组为空_CodeChanningAz的博客-CSD…

leecode 数据库:570. 至少有5名直接下属的经理

导入数据&#xff1a; Create table If Not Exists Employee (id int, name varchar(255), department varchar(255), managerId int); Truncate table Employee; insert into Employee (id, name, department, managerId) values (101, John, A, None); insert into Employee …

Python自然语言处理:NLTK入门指南

Python自然语言处理&#xff1a;NLTK入门指南 一、Python自然语言处理简介1. 什么是自然语言处理&#xff08;NLP&#xff09;2. Python在NLP中的应用3. 为什么选择使用Python进行NLP 二、NLTK介绍1. NLTK是什么2. NLTK的历史和现状3. NLTK的安装和配置4. NLTK的基本功能分词&a…