遞迴判斷物件或集合是否全為空的工具

2021-10-09 21:31:40 字數 4776 閱讀 9440

1、**依賴了hutool的相關api,如果不想依賴hutool的話可以用阿帕奇或者spring的相關api進行替換。

2、對於是否為空的標準在**裡是寫死的,詳見注釋。

工具類的**如下:

/**

* 的過載方法,ignoreboolean引數為false

* * @param object 要判斷的物件

* @return object的所有屬性是否都為空

*/public

static boolean isdeepempty

(object object)

/** * 遞迴判斷物件及其所有父類的所有屬性是否為空。

* 判斷是否為空的標準:

* *

* @param object 要判斷的物件

* @param ignoreboolean 是否忽略布林型別的比較,因為布林型別只有真或者假,區分度較低

* @return object的所有屬性是否都為空

*/public

static boolean isdeepempty

(object object, boolean ignoreboolean)

else

if(object instanceof

iterable)}

);return allempty.

get();

}return

true;}

else

if(object.

getclass()

.isarray()

&& arrayutil.

isnotempty

(object)

)else

if(object instanceof

charsequence

)else

if(object instanceof

map)

else

catch

(illegalacces***ception e)

catch

(illegalacces***ception illegalacces***ception)}if

(objects.

isnull

(value)

)continue

;else

} currentclass = currentclass.

getsuperclass()

;}}return

true;}

/** * 判斷傳入的物件是否是基本型別的預設值。

* 當類成員為基本型別時,即使沒有對其初始化,jvm會為其賦初始值,八大型別的預設值如下所示:

* * boolean ---》 false

* * char ---》 '/uoooo'(null)

* * byte ---》 (byte)0

* * short ---》 (short)0

* * int ---》 0

* * long ---》 0l

* * float ---》 0.0f

* * double ---》 0.0d

* * @param object 待判斷的值

* @param ignoreboolean 是否忽略boolean型別的判斷

* @return 當object為基本型別的預設值時,返回,否則返回false

*/public

static

boolean

isprimitivedefault

(object object, boolean ignoreboolean)

else

if(typename.

equalsignorecase

(byte.

class

.get******name()

))else

if(typename.

equalsignorecase

(long.

class

.get******name()

))else

if(typename.

equalsignorecase

(double.

class

.get******name()

))else

if(typename.

equalsignorecase

(float.

class

.get******name()

))else

if(typename.

equalsignorecase

(character.

class

.get******name()

))else

if(typename.

equalsignorecase

(short.

class

.get******name()

))elseif(

!ignoreboolean && typename.

equalsignorecase

(boolean.

class

.get******name()

))return

false

;}

public

class

objectutiltest

/** * 測試基本資料型別的預設值

*/@test

public

void

testprimitive()

/** * 測試是否忽略boolean型別

*/@test

public

void

testignoreboolean()

/** * 測試繼承父類屬性

*/@test

public

void

testextend()

/** * 測試pojo巢狀

*/@test

public

void

testnestpojo()

/** * 測試入參為陣列

*/@test

public

void

testarray()

; assert.

assertequals

(true

, objectutil.

isdeepempty

(emptystudentarray));

student[

] notemptystudentarray =

; assert.

assertequals

(false

, objectutil.

isdeepempty

(notemptystudentarray));

}/**

* 測試迭代器

*/@test

public

void

testiterator()

/** * 測試入參字串

*/@test

public

void

teststring()

/** * 測試入參為map介面的例項

*/@test

public

void

testmap()

/** * 測試無效的屬性名是否會被跳過 如:

* * 以$開頭的屬性* 序列化屬性serialversionuid* 名字為class的屬性* */

@test

public

void

testinvalidpropertyname()

/** * 測試pojo巢狀集合的情況

*/@test

public

void

testpojonextlist()

/** * 課程類

*/class

course

public

void

setname

(string name)

public

void

setstudents

(list

students)

}class

people

public

void

setname

(string name)

}class

serialobject

implements

serializable

public

void

setname

(string name)

}class

student

extends

people

public

student

(string nickname)

public course getcourse()

public

void

setcourse

(course course)

public boolean getpretty()

public

void

setpretty

(boolean pretty)

}}

陣列或集合呼叫前,判斷是否為空

首先,了解一下null和.length size的區別 null就是意思只定義沒有建立物件,如 object o 如果呼叫o.length會報錯,因為它沒有任何.功能。length則是判斷這個陣列的元素個數,size類似。然後,寫好的程式中如果我們沒有稍加判斷,在呼叫的時候,如果為空或長度小於零,這...

判斷物件是否是空物件

object.keys 方法會返回乙個由乙個給定物件的自身可列舉屬性組成的陣列。通過陣列中屬性的個數判斷是否為空物件。const empty object.keys empty length 0 empty.constructor object 而且需要判斷物件的constructor屬性是否等於o...

js 判斷是否為空物件 空陣列

js 判斷是否為空物件 空陣列 當需要判斷引數是否為空時,總希望 js 能夠提供原生的判斷方法,可惜並沒有,只能自己封裝了。isempty function obj 檢驗陣列 if array.prototype.isprototypeof obj obj.length 0 檢驗物件 if obje...