從Java集合中删除元素
1.概述
在本快速教程中,我們將討論從Java集合中刪除與某些謂詞匹配的項的四種不同方法。
我們自然也將研究一些警告。
2.定義我們的收藏
首先,我們將說明兩種改變原始數據結構的方法。然後,我們將討論另外兩個選項,它們不是刪除項目,而是創建沒有它們的原始Collection的副本。
讓我們在示例中使用以下集合,以演示如何使用不同的方法獲得相同的結果:
Collection<String> names = new ArrayList<>();
names.add("John");
names.add("Ana");
names.add("Mary");
names.add("Anthony");
names.add("Mark");
3.使用迭代器刪除元素
Java的Iterator使我們能夠遍歷和刪除*Collection*中的每個元素。
為此,我們首先需要使用*iterator方法在其元素上檢索一個迭代器。之後,我們可以在next的幫助下訪問每個元素,並使用remove*刪除它們:
Iterator<String> i = names.iterator();
while(i.hasNext()) {
String e = i.next();
if (e.startsWith("A")) {
i.remove();
}
}
儘管它很簡單,但仍應注意一些警告:
- 根據集合的不同,我們可能會遇到ConcurrentModificationException異常
- 我們需要遍曆元素,然後才能將其刪除
- 根據集合的不同, remove的行為可能與預期的不同。例如: ArrayList.Iterator從集合中刪除元素,並將後續數據向左移動,而LinkedList.Iterator只是將指針調整為下一個元素。這樣,在刪除項目時, LinkedList.Iterator的性能比ArrayList.Iterator好得多。
4. Java 8和Collection.removeIf()
Java 8向*Collection接口引入了一種新方法,該方法提供了一種更簡潔的使用Predicate刪除元素的方法:*
names.removeIf(e -> e.startsWith("A"));
重要的是要注意,與Iterator方法相反, removeIf在LinkedList和ArrayList中的表現相似。
在Java 8中, ArrayList覆蓋默認的實現(依賴Iterator) ,並實現不同的策略:首先,對元素進行迭代並標記與謂詞匹配的元素。之後,第二次迭代以刪除(並移動)在第一次迭代中標記的元素。
5. Java 8和流的介紹
Java 8的新主要功能之一是添加了Stream (和Collector )。有多種方法可以從源創建流。但是,大多數影響Stream實例的操作都不會改變其源,相反,API專注於創建源的副本並執行我們可能需要在其中進行的任何操作。
讓我們看一下如何使用Stream和Collector來查找/過濾與Predicate匹配但不匹配的元素。
5.1。用流刪除元素
刪除,或者更確切地說,過濾用流是非常簡單的元素,我們只需要使用我們的系列創建流的實例,調用*過濾器與我們的謂語,然後收集與收藏家的幫助的結果:*
Collection<String> filteredCollection = names
.stream()
.filter(e -> !e.startsWith("A"))
.collect(Collectors.toList());
與以前的方法相比,流技術的侵入性較小,它促進了隔離,並允許從同一源創建多個副本。但是,請記住,這也會增加應用程序使用的內存。
5.2。通過Collectors.partitioning
儘管我們可能會遇到同時需要匹配元素和不匹配元素的場景,但將Stream.filter和Collector結合起來非常方便。在這種情況下,我們可以利用*Collectors.partitioningBy的*優勢:
Map<Boolean, List<String>> classifiedElements = names
.stream()
.collect(Collectors.partitioningBy((String e) ->
!e.startsWith("A")));
String matching = String.join(",",
classifiedElements.get(true));
String nonMatching = String.join(",",
classifiedElements.get(false));
此方法返回僅包含兩個鍵true和false的Map ,每個鍵分別指向包含匹配元素和不匹配元素的列表。
六,結論
在本文中,我們研究了一些從Collections中刪除元素的方法及其註意事項。
您可以在GitHub上找到本文的完整源代碼和所有代碼片段。