一般情況下,我們會(huì)對(duì)集合有判空操作。但是往往我們只會(huì)做如下的判空:
list == null || list.size()==0
可是經(jīng)常忽略了可能出現(xiàn)的這種情況。
list.size()==1&&null==list.get(0)
而這種情況其實(shí)很容易出現(xiàn)。
比如我們寫了一個(gè)sql,去獲取一些記錄。
對(duì)于唯一的記錄,返回的null值,我們通常會(huì)想到處理它。因?yàn)槭俏┮坏挠涗洶。?,有值還是沒值的問題,對(duì)程序員的迷惑性很低。
而當(dāng)我們使用List<T>接收時(shí),其實(shí)是很容易被迷惑的。
來看實(shí)際的問題吧。
還是sql。sql是很容易產(chǎn)生null值的。
以下兩種常見的坑,我來寫一下。
1、T為一條完整的記錄
如果sql直接查的就是一條完整的sql,那么它有,沒有,這兩種場(chǎng)景是十分明確的,是有一條分界線的。id存在就是存在。
所以如果用List接收,只可能出現(xiàn)[null]這一種情況。所以,稍微注意到這個(gè)問題之后,就很容易用我上面那條語(yǔ)句規(guī)避,并且篤定,不可能出現(xiàn)第二條null值。
然而現(xiàn)實(shí)是殘酷且戲劇性的,因?yàn)橥ǔN覀兛赡苤恍枰@取到的sql記錄中的某個(gè)字段的值。這樣就出現(xiàn)了第二種情況。
2、T不是一條完整的記錄
如果sql只是查一個(gè)字段,然后用String來接收,可能這條記錄在數(shù)據(jù)庫(kù)中是存在的,但是這個(gè)字段是不存在的。因此當(dāng)查詢到多條數(shù)據(jù)時(shí),奇妙的bug產(chǎn)生了。你發(fā)現(xiàn)你發(fā)送了一連串的null值。如:[null,null,null,null,null]
并且會(huì)大呼奇怪,怎么可能有這樣的情況!我的sql,我的sql明明?。?!誒,當(dāng)你細(xì)想之后,意識(shí)到sql可能出現(xiàn)這種問題的時(shí)候,可能你的代碼已經(jīng)上線,在瘋狂告警中被diss。
所以,建議對(duì)于集合接收的sql記錄,在使用前,都可以做一個(gè)去null處理
我提供了一個(gè)utils方法
/**
* 去除List<String>中的所有null值。
* 如果本身為空/null,則返回空l(shuí)ist
*/
public static List<String> getNonNullObjList(List<String> oriList ){
if(CollectionUtils.isEmpty(oriList)){
return Collections.EMPTY_LIST;
}
return oriList.stream().filter(Objects::nonNull).collect(Collectors.toList());
}
當(dāng)你使用list之前,判空之前,先去除其中的不應(yīng)該存在的null值,避免參數(shù)檢查混淆視線。
以上。