如何在 Java 清單中尋找空字串
1.概述
在本教程中,我們將探索如何在 Java 中偵測List<String>
中的null
或空String
。我們將從經典的for
循環開始,該循環會明確檢查每個元素,以便理解其機制和邊緣情況。然後,我們將學習一種現代的Stream
方法,該方法可以使程式碼簡潔且富有表現力。
2. for
循環檢查
在整個程式碼中,我們將使用以下範例List
:
List<String> list = Arrays.asList("Madrid", null, " ", "Havana", "");
讓我們從一個for
迴圈開始:
@Test
void givenListWithNullOrEmpty_whenCheckForNullOrEmptyUsingForLoop_thenReturnTrue() {
boolean hasNullOrEmpty = false;
for (String s : list) {
if (s == null || s.isEmpty()) {
hasNullOrEmpty = true;
break;
}
}
assertTrue(hasNullOrEmpty, "List should contain null or empty elements");
}
for
迴圈會依序遍歷List
並檢查每個元素。對於每個元素,我們首先檢查其是否為空。如果不為null
,則呼叫isEmpty()
方法。如果發現null
或空String
,則停止並將結果設為true
。這避免了在找到早期匹配項時掃描整個List
。
此解決方案運行時間為O(n)
,佔用空間O(1)
。它簡潔易懂,易於調試。需要注意的是, isEmpty()
將” “
視為非空;我們可以使用isBlank()
方法來處理這種情況。
3. 使用Stream
現在,讓我們用一行程式碼實作Stream
的相同檢查:
@Test
void givenListWithNullOrEmpty_whenCheckForNullOrEmptyUsingStreams_thenReturnTrue() {
boolean hasNullOrEmpty = list.stream()
.anyMatch(s -> s == null || s.isEmpty());
assertTrue(hasNullOrEmpty, "List should contain null or blank elements");
}
在這個方法中,我們將List
轉換為 Stream。然後,我們使用anyMatch()
函數,該函數首先檢查是否null
,然後執行isEmpty()
。 anyMatch()
方法會在第一次匹配時停止。因此, Stream
並不總是會處理每個元素。
此解的運轉時間為O(n)
,佔用空間為 O(1)。此版本僅用一行程式碼就清晰地表達了意圖。
我們也可以使用並行Stream
檢查是否為null
或為空String
:
@Test
void givenListWithNullOrEmpty_whenCheckUsingParallelStream_thenReturnTrue() {
boolean hasNullOrEmpty = list.parallelStream()
.anyMatch(s -> s == null || s.isEmpty());
assertTrue(hasNullOrEmpty, "List should contain null or empty elements");
}
並行Stream
將工作拆分到多個核心上。邏輯保持不變,但處理是並行的。如我們所見,並行流最適合處理大型資料集。對於較小的List
,常規Stream
通常更快。
4. 結論
在本文中,我們探討如何在 Java 中偵測List<String>
中的null
或空String
。我們看到一個for
循環,它檢查每個元素(先檢查null
,然後isEmpty()
),並在第一個匹配時停止。我們也研究了一個Stream
解決方案,它使用anyMatch()
和isEmpty()
來在一行程式碼中實作相同的檢查。
兩種方法的運行時間都是O(n)
,空間使用O(1)
。
與往常一樣,原始碼可在 GitHub 上取得。