聊聊Java中如何像Python中一样优雅的判断非空非null
一、背景
作为Java和Python都在使用的开发者,经常在长时间使用Python后再去开发Java项目的时候,就被Java这种强语言小小的折磨!里面一些语法经常没有Python简洁优雅!但这不是评判两者语言优劣的标准,作为使用者,最好是融会贯通。出于此目的前来聊聊~
二、聊聊Python
众所周知,Python中一切皆对象!Python中一切皆对象!Python中一切皆对象!
从面向对象的知识出发,对象都有成员属性和方法(Java知识点)
那我想说的是什么呢?
有Python开发经验的人知道,我们在python中判断一个对象和序列(序列就是列表,集合,字典的统称)
# 判断一个列表是否为空
list_demo = []
if list_demo:
print("list_demo is not empty")
else:
print("list_demo is empty")
可以看到,并不需要显式的去做一些操作,直接将列表对象作为判断条件,其底层Python就是调用了其__len__魔法方法(魔法方法有兴趣可以去了解),因为一切是对象才有方法!这也是我为什么要强调Python中一切皆对象。因为list_demo为空,因此__len__魔法方法返回0值,因此其布尔值就为Fasle。
这里还涉及到一个知识点:Python中约定俗成的将:空序列、一切0值(比如0,0.00)、None、False为假值。当然,不是上述提到的就是真值。
这里我们看一段Python的官方文档的解释:
任何对象都可以进行逻辑值的检测,以便在 if 或 while 作为条件或是作为下文所述布尔运算的操作数来使用。
一个对象在默认情况下均被视为真值,除非当该对象被调用时其所属类定义了 __bool__() 方法且返回
False
或是定义了 __len__() 方法且返回零。
None
在 Python 中表示“无值”或“空值” ,但又因为None在Python中表示假值,因此,在Python中判断非空非Null,直接 if 对象。
简洁 优雅!但是吧,我觉得这也是方便开发者,毕竟没有表达代码的语义,不方便没有Python经验的阅读者,看代码的人可不知道 if 对象名 这是在判断什么。
三、Java中如何优雅的判空判Null?
空指针一直是Java中一个恒久的话题,有Java开发经验的人是不是最恐惧空指针Exception?因此,我们一般都这样做
// 这里假设是Web项目,前端发来了一个String, 名字叫strDemo
// 这里判断这个字符串非空非null
// 我们一般会这么写
if (strDemo !="" || strDemo != null){
}
如果是Java中的序列呢?
if (listDemo == null || listDemo.size() == 0){
}
像上面这样写能打成功能目的吗?能! 但是不够优雅!个人觉得,起语义理解也差点火候。
所以我们为什么要优雅的处理Java中的非空非null呢?
这就跟郭德纲说的一样:一个成熟的相声表演演员,到了一定火候,他自然便知道在台上能说什么、不能说什么、说什么更好。
接下来我就拿开发中最常用的字符串对象、和序列对象举个例子!
3.1 优雅的判断对象
使用java uitl下的ObjectUtils包
上面对字符串判断的代码就变成
if (ObjectUtils.isEmpty(strDemo)){
}
这样做也完成了对对象非空非null的判断,不仅如此,从语义上来讲,我们也很容易明白这是在做什么:is表示是否 Empty表示空 、没有 ,isEmpty在做什么不言而喻,语义明了。
返回值为布尔值,说明如果为空就返回真,不为空就为假,当然了,包里还有isNotEmpty方法,根据使用场景选择就好!
是不是比上面的那种写法优雅~,易理解?
3.2 优雅的判断序列
用 CollectionUtils包,属于Apache旗下的
上面对序列判断的代码就变成
if (CollectionUtils.isNotEmpty(listDemo)) {
}
其语义和优雅程度不言而喻