關(guān)于java集合List判空的一個(gè)遺漏情況

一般情況下,我們會(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ù)檢查混淆視線。
以上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容