檢查清單是否至少包含一個枚舉
一、簡介
在 Java 中,枚舉 (еnum) 是表示一組固定常數的強大且類型安全的方式。此外,當我們使用Lists
這樣的集合時,我們可能會遇到需要檢查List
是否至少包含一個特定枚舉類型的元素的情況。
在本文中,我們將探索用 Java 實現此目的的各種方法,並附上程式碼範例。
2. 問題陳述
在深入討論主題之前,讓我們先簡單回顧一下 Java 中列舉的基礎知識。枚舉是一種特殊的資料類型,它允許我們定義一組命名常數,這些常數代表一組固定的、預先定義的值。此外,與使用原始常數或整數相比,枚舉提供更好的類型安全性和可讀性。
public enum Position {
DEVELOPER, MANAGER, ANALYST
}
在這裡,我們聲明了一個名為Position
的枚舉,其中包含三個常數: DEVELOPER
、 MANAGER
和ANALYST
。
現在,讓我們探討一下這種情況下的程式碼片段:
public class CheckIfListContainsEnumUnitTest {
private final List<Map<String, Object>> data = new ArrayList<>();
public CheckIfListContainsEnumUnitTest() {
Map<String, Object> map = new HashMap<>();
map.put("Name", "John");
map.put("Age", 25);
map.put("Position", Position.DEVELOPER);
data.add(map);
}
}
在此程式碼片段中,我們定義了一個名為data
的清單來儲存包含鍵值對的對應。此外, ChеckIfListContainsEnumUnitTеst
類別還包括map
的實例化,其中包含個人的Namе,
Agе
和Position
等詳細資訊。
請記住,這為探索方法來檢查清單是否至少包含一個枚舉值奠定了基礎。
3. 傳統方法
傳統方法涉及迭代List
並根據枚舉常數檢查每個元素。讓我們舉一個基本的例子:
@Test
public void givenDataList_whenUsingLoop_thenCheckIfListContainsEnum() {
boolean containsEnumValue = false;
for (Map<String, Object> entry : data) {
Object positionValue = entry.get("Position");
if (Arrays.asList(Position.values()).contains(positionValue)) {
containsEnumValue = true;
break;
}
}
Assert.assertTrue(containsEnumValue);
}
在此測試方法中,給定一個data
列表,該方法使用循環迭代每個條目,檢索PositionValue
,並檢查它是否存在於枚舉類型Position
中。此外, containsEnumValue
布林變數捕獲的結果表示資料列表中是否至少有一個匹配項。最後,斷言驗證清單中至少有一個條目包含符合的枚舉值。
4. 使用anyMatch()
方法
我們可以利用anyMatch()
方法來檢查流中是否至少有一個元素與指定條件相符。這是一個例子:
@Test
public void givenDataList_whenUsingStream_thenCheckIfListContainsEnum() {
boolean containsEnumValue = data.stream()
.map(entry -> entry.get("Position"))
.anyMatch(position -> Arrays.asList(Position.values()).contains(position));
Assert.assertTrue(containsEnumValue);
}
上面的測試方法透過從每個條目中提取Position
值來轉換data
列表,然後使用anyMatch()
方法來確定這些值中的任何一個是否存在於枚舉類型Position
中。這種簡化的方法用簡潔且富有表現力的流操作取代了傳統的迭代循環。
5. 使用Collеctions.disjoint()
方法
另一種方法是利用Collеctions.disjoint()
方法來確定兩個清單之間是否存在共同點。讓我們嘗試下面的程式碼範例:
@Test
public void givenDataList_whenUsingDisjointMethod_thenCheckIfListContainsEnum() {
List<Position> positionValues = data.stream()
.map(entry -> (Position) entry.get("Position"))
.toList();
boolean containsEnumValue = !Collections.disjoint(Arrays.asList(Position.values()), positionValues);
Assert.assertTrue(containsEnumValue);
}
在此方法中,我們利用Collеctions.disjoint()
方法來確定原始清單(可能名為list
)和新建立的Position
值清單(可能名為positionValues
)之間是否存在任何共同點。
然後,布林變數containsEnumValue
被賦予否定Collеctions.disjoint()
結果的結果,並表示兩個列表之間不存在不相交。
六,結論
在本文中,我們探索了不同的方法來檢查 Java 中的List
是否至少包含一個枚舉。此外,方法的選擇取決於我們的特定要求和編碼風格偏好。
與往常一樣,隨附的源代碼可以在 GitHub 上找到。