聊聊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)) {
 
}

其语义和优雅程度不言而喻