從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方法相反, removeIfLinkedListArrayList中的表現相似。

在Java 8中, ArrayList覆蓋默認的實現(依賴Iterator) ,並實現不同的策略:首先,對元素進行迭代並標記與謂詞匹配的元素之後,第二次迭代以刪除(並移動)在第一次迭代中標記的元素。

5. Java 8和的介紹

Java 8的新主要功能之一是添加了Stream (和Collector )。有多種方法可以從源創建。但是,大多數影響Stream實例的操作都不會改變其源,相反,API專注於創建源的副本並執行我們可能需要在其中進行的任何操作。

讓我們看一下如何使用StreamCollector來查找/過濾與Predicate匹配但不匹配的元素。

5.1。用刪除元素

刪除,或者更確切地說,過濾用是非常簡單的元素,我們只需要使用我們的系列創建的實例,調用*過濾器與我們的謂語,然後收集收藏家的幫助的結果:*

Collection<String> filteredCollection = names

 .stream()

 .filter(e -> !e.startsWith("A"))

 .collect(Collectors.toList());

與以前的方法相比,技術的侵入性較小,它促進了隔離,並允許從同一源創建多個副本。但是,請記住,這也會增加應用程序使用的內存。

5.2。通過Collectors.partitioning

儘管我們可能會遇到同時需要匹配元素和不匹配元素的場景,但將Stream.filterCollector結合起來非常方便在這種情況下,我們可以利用*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));

此方法返回僅包含兩個鍵truefalseMap ,每個鍵分別指向包含匹配元素和不匹配元素的列表。

六,結論

在本文中,我們研究了一些從Collections中刪除元素的方法及其註意事項。

您可以在GitHub上找到本文的完整源代碼和所有代碼片段。