檢查Java中的集合中是否存在元素
1. 概述
在這個簡短的教學中,我們將重點放在如何檢查 Java 中的Set
中是否存在元素。
首先,我們將透過探索使用核心 JDK 的解決方案來開始。然後,我們將闡明如何使用 Apache Commons 等外部函式庫來實現相同的結果。
2.使用核心JDK
Java 提供了幾種方便的方法來檢查Set
是否包含給定元素。讓我們探索一下這些並看看如何在實踐中使用它們。
2.1. Set#contains()
方法
顧名思義,此方法檢查特定Set
是否包含給定元素。這是我們可以用來回答核心問題的最簡單的解決方案之一:
@Test
void givenASet_whenUsingContainsMethod_thenCheck() {
assertThat(CITIES.contains("London")).isTrue();
assertThat(CITIES.contains("Madrid")).isFalse();
}
通常,如果Set
中存在給定元素, contains()
方法將傳回true
,否則false
。
根據文檔,該方法傳回true
當且僅:
object==null ? element==null : object.equals(element);
這就是為什麼在Set
物件所屬的類別中實作equals()
方法很重要。這樣,我們就可以自訂相等邏輯來考慮所有或部分類別欄位。
簡而言之,與其他方法相比, contains() 方法提供了最簡潔、最直接的方法來檢查給定**Set**
contains()
是否存在元素。
2.2. Collections#disjoint()
方法
Collections
實用程式類別提供了另一種方法,稱為disjoint(),
我們可以使用它來檢查Set
是否包含給定元素。
此方法接受兩個集合作為參數,如果它們沒有共同元素,則傳回 true :
@Test
public void givenASet_whenUsingCollectionsDisjointMethod_thenCheck() {
boolean isPresent = !Collections.disjoint(CITIES, Collections.singleton("Paris"));
assertThat(isPresent).isTrue();
}
總的來說,我們創建了一個僅包含給定字串“Paris”
的不可變Set
。此外,我們使用否定運算子的disjoint()
方法來檢查兩個集合是否具有共同元素。
2.3. Stream#anyMatch()
方法
Stream API 提供了anyMatch()
方法,我們可以使用它來驗證給定集合的任何元素是否與提供的**謂詞**相符。
那麼,讓我們看看它的實際效果:
class CheckIfPresentInSetUnitTest {
private static final Set<String> CITIES = new HashSet<>();
@BeforeAll
static void setup() {
CITIES.add("Paris");
CITIES.add("London");
CITIES.add("Tokyo");
CITIES.add("Tamassint");
CITIES.add("New york");
}
@Test
void givenASet_whenUsingStreamAnyMatchMethod_thenCheck() {
boolean isPresent = CITIES.stream()
.anyMatch(city -> city.equals("London"));
assertThat(isPresent).isTrue();
}
}
正如我們所看到的,我們使用謂詞city.equals(“London”)
來檢查流中是否有任何城市符合等於“London”
的條件。
2.4. Stream#filter()
方法
另一種解決方案是使用filter()
方法。它傳回一個由滿足所提供條件的元素組成的新流。
換句話說,它根據指定的條件過濾流:
@Test
void givenASet_whenUsingStreamFilterMethod_thenCheck() {
long resultCount = CITIES.stream()
.filter(city -> city.equals("Tamassint"))
.count();
assertThat(resultCount).isPositive();
}
如上所示,我們過濾了Set
以僅包含等於值“Tamassint”
的元素。然後,我們使用終端機操作count()
傳回過濾後元素的數量。
3. 使用 Apache Commons 集合
如果我們想要檢查給定元素是否存在於Set
中,Apache Commons Collections 庫是另一個可以考慮的選擇。讓我們先將其依賴項新增至pom.xml
檔:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
3.1. CollectionUtils#containsAny()
方法
CollectionUtils
提供了一組實用方法來對集合執行常見操作。在這些方法中,我們找到containsAny(Collection<?> coll1, Collection<?> coll2).
如果第二個集合中的至少一個元素也包含在第一個集合中,則此方法傳回 true。
那麼,讓我們看看它的實際效果:
@Test
void givenASet_whenUsingCollectionUtilsContainsAnyMethod_thenCheck() {
boolean isPresent = CollectionUtils.containsAny(CITIES, Collections.singleton("Paris"));
assertThat(isPresent).isTrue();
}
類似地,我們建立了一個包含一個元素“Paris”
的單例Set
。然後,我們使用containsAny()
方法來檢查我們的集合CITIES
是否包含給定值“Paris”
。
3.2. SetUtils#intersection()
方法
或者,我們可以使用SetUtils
實用程式類別來解決我們的挑戰。此類別提供intersection(Set<? extends E> a, Set<? extends E> b)
方法,該方法傳回一個新Set
,其中包含同時存在於指定兩個 Set 中的元素:
@Test
void givenASet_whenUsingSetUtilsIntersectionMethod_thenCheck() {
Set<String> result = SetUtils.intersection(CITIES, Collections.singleton("Tamassint"));
assertThat(result).isNotEmpty();
}
簡而言之,這裡的想法是透過檢查CITIES
與給定單例Set
之間的交集是否不為空來驗證城市“Tamassint”
是否存在於CITIES
中。
4。結論
在這篇短文中,我們探討如何在 Java 中檢查Set
是否包含給定元素的本質。
首先,我們了解如何使用現成的 JDK 方法來執行此操作。然後,我們示範如何使用 Apache Commons Collections 函式庫來實現相同的目標。
與往常一樣,本文中使用的程式碼可以在 GitHub 上找到。