Java 中的空數組到空列表
1. 概述
在 Java 程式設計中,簡單性往往隱藏在null
值的處理背後,尤其是在處理陣列時。同樣,將可能為null
陣列轉換為空List
不僅僅是為了防止NullPointerException
;它還涉及編寫有彈性的程式碼。
在本教程中,我們將討論將可為空數組安全地轉換為List
多種方法。
2. 設定
首先,讓我們定義我們將用於實作的方法簽章:
static List<String> getAsList(String[] possiblyNullArray) {
// Implementation: return nullable array as list
}
我們將接受一個possiblyNullArray
作為我們的方法參數,並傳回一個包含原始陣列中所有值的非空列表。重要的是,如果原始數組為 null 或為空,則我們的最終清單將為空。
現在,讓我們來看看一些方法。
3. 使用 Java 8+ 串流
在我們的第一個實作中,我們將使用 Java Streams
API。 Java 8 引入了Optional
類別來處理可能缺失或null
值的情況。
讓我們先使用Optional.ofNullable()
來處理這個可能為null
陣列:
return Optional.ofNullable(possiblyNullArray)
.map(Arrays::stream)
.orElseGet(Stream::empty)
.collect(Collectors.toList());
我們將陣列包裝在Optional
中,然後嘗試對值stream()
處理。如果陣列為空,我們將得到一個空流而不是值流。這確保了當我們將 steam collect()
到列表時,我們的結果是數組中的值列表或空列表。
如果我們想要避免串流值,我們可以稍微不同地處理Optional
中的預設值:
return Arrays.asList(Optional.ofNullable(possiblyNullArray).orElse(new String[0]));
在這裡,如果在將數組轉換為列表之前原始數組null
,我們將傳回一個空數組。
上述兩種方法都安全地傳回帶有單一表達式的String
List
。
4. 使用三元運算符
在 Java 8 之前,我們也可以使用簡單的三元運算子來檢查null
並在陣列為null
時傳回一個空List
:
return possiblyNullArray == null ? new ArrayList<>() : Arrays.asList(possiblyNullArray);
上面的範例是一個簡短的if/else
表達式:如果陣列為null
,則傳回一個空List
,否則使用Arrays.asList() –
一個簡單而優雅的解決方案。
5. 使用 Apache Commons Lang
有時我們可能會想要使用外部依賴項來為我們完成工作。第三種實作著重於核心 Java API 之外並使用 Apache Commons Lang。
這個函式庫提供了一個ArrayUtils
類,其中包括nullToEmpty()
它將 null 數組轉換為空數組:
String[] notNullArray = ArrayUtils.nullToEmpty(possiblyNullArray);
return Arrays.asList(notNullArray);
之後,剩下的就是將數組轉換為列表。
6. 驗證
現在我們已經看到了所有不同的實現,讓我們針對以下三個測試運行每個實現:
@Test
public void whenArrayIsNull_thenReturnEmptyList() {
String[] possiblyNullArray = null;
assertThat(getAsList(possiblyNullArray)).isNotNull().isEmpty();
}
@Test
public void whenArrayIsEmpty_thenReturnEmptyList() {
String[] possiblyNullArray = {};
assertThat(getAsList(possiblyNullArray)).isNotNull().isEmpty();
}
@Test
public void whenArrayIsNotEmpty_thenReturnListWithSameElements() {
String[] possiblyNullArray = {"a", "b"};
assertThat(getAsList(possiblyNullArray)).containsExactly(possiblyNullArray);
}
透過這三種情況,我們涵蓋了一個null
數組、一個空數組和一個包含一些值的數組,這些都是這個問題的可能性。
七、結論
在本文中,我們學習如何使用多種方法將可為 null 的陣列轉換為List
,同時避免可能的NullPointerException
。我們研究了 Java 8+ Optional
功能、三元運算子的實現,最後使用了 Apache Commons 等外部函式庫。
與往常一樣,本文中使用的完整程式碼可以在 GitHub 上找到。