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 上找到。