最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Collection 移除元素方法及注意事項

 更新時間:2020年01月03日 10:10:49   作者:碼農(nóng)小胖哥  
這篇文章主要介紹了Java Collection 移除元素方法及注意事項,通過一個簡單實例給大家講解,需要的朋友可以參考下

1. 前言

操作集合是一個 Java 編程人員幾乎每天都在重復(fù)的事情。今天我們來研究一下從 Java Collection 中刪除元素的方法。我構(gòu)建了一個簡單的集合,我們以此為例子來展開探索。

 List<String> servers = new ArrayList<>();
 servers.add("Felordcn");
 servers.add("Tomcat");
 servers.add("Jetty");
 servers.add("Undertow");
 servers.add("Resin");

2. for 循環(huán)并不一定能從集合中移除元素

讓我們使用傳統(tǒng)的 foreach 循環(huán)移除 F 開頭的假服務(wù)器,但是你會發(fā)現(xiàn)這種操作引發(fā)了 ConcurrentModificationException 異常。

 // 錯誤的示范 千萬不要使用
 for (String server : servers) {
 if (server.startsWith("F")) {
 servers.remove(server);
 }
 }

難道 for 循環(huán)就不能移除元素了嗎?當(dāng)然不是!我們?nèi)绻艽_定需要被移除的元素的索引還是可以的。

 // 這種方式是可行
 for (int i = 0; i < servers.size(); i++) {
 if (servers.get(i).startsWith("F")) {
 servers.remove(i);
 }
}

但是這種方式我目前只演示了 ArrayList,其它的類型并沒有嚴(yán)格測試,留給你自己探索。

3. 迭代器 Iterator 可以刪除集合中的元素

在傳統(tǒng)方式中我們使用 Iterator 是可以保證刪除元素的:

 Iterator<String> iterator = servers.iterator();

 while (iterator.hasNext()) {
  String next = iterator.next();
  if (next.startsWith("F")) {
  iterator.remove();
  }
 }

4. 遍歷刪除元素的缺點

  • 我們需要遍歷集合的每一個元素并對它們進(jìn)行斷言,哪怕你刪除一個元素。
  • 盡管我們可以通過迭代的方式刪除特定的元素,但是操作繁瑣,根據(jù)集合類型的不同有潛在的 ConcurrentModificationException 異常。
  • 根據(jù)數(shù)據(jù)結(jié)構(gòu)的不同,刪除元素的時間復(fù)雜度也大大不同。比如數(shù)組結(jié)構(gòu)的 ArrayList 在刪除元素的速度上不如鏈表結(jié)構(gòu)的 LinkedList。

5. 新的集合元素刪除操作

Java 8 提供了新的集合操作 API 和 Stream 來幫助我們解決這個問題。我在以前的文章中已經(jīng)介紹了 Java 8 Stream API,如果有興趣可以去看看。

5.1 Collection.removeIf()

新的 Collection Api removeIf(Predicate<? super E> filter) 。該 Api 提供了一種更簡潔的使用 Predicate (斷言)刪除元素的方法,于是我們可以更加簡潔的實現(xiàn)開始的需求:

servers.removeIf(s-> s.startsWith("F"));

同時根據(jù)測試,ArrayList 和 LinkedList 的性能接近。一般推薦使用這種方式進(jìn)行操作。

5.2 Stream 實現(xiàn)移除元素

和上面所有移除操作不同的是,其實任何操作都不會改變 Stream 源,我們僅僅是使用 Stream Api 操作數(shù)據(jù)源的副本。遵循了 數(shù)據(jù)源 -> 中間操作 -> 歸納終止 的生命周期。我們來看看使用 Stream 如何實現(xiàn)我們的意圖。

5.2.1 通過 filter 斷言實現(xiàn)

我們可以使用 Stream 的 filter 斷言。filter 斷言會把符合斷言的流元素匯集成一個新的流,然后歸納起來即可,于是我們可以這么寫:

// 跟以上不同的是 該方式中的斷言是取反的操作。
List<String> newServers = servers.stream().filter(s -> !s.startsWith("F")).collect(Collectors.toList());

這個優(yōu)點上面已經(jīng)說了不會影響原始數(shù)據(jù),生成的是一個副本。缺點就是可能會有內(nèi)存占用問題。

5.2.2 通過 Collectors.partitioningBy 歸納

這種方法雖然可以滿足需要但是我感覺有點投機(jī)取巧的成份。Collectors.partitioningBy() 方法本意是做二分類的。該方法會將流中符合斷言的、不符合斷言的元素分別歸納到兩個 key 分別為 true 和 false 的 Map 中,我們可以歸類得到符合和不符合的元素集。實現(xiàn)如下:

Map<Boolean, List<String>> f = servers.stream().collect(Collectors.partitioningBy(s -> !s.startsWith("F")));
 
 List<String> trues = f.get(Boolean.TRUE);
 System.out.println("不以 F 開頭的: " + trues);

 List<String> falses = f.get(Boolean.FALSE);
 System.out.println("以 F 開頭的: " + falses);

一般該方式不推薦在此場景使用,并不符合該 Api 的設(shè)計意圖。

6. 總結(jié)

今天我們研究了一些從 Collections 中刪除元素的方法 及其注意事項。希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • java中的類型自動轉(zhuǎn)換機(jī)制解析

    java中的類型自動轉(zhuǎn)換機(jī)制解析

    這篇文章主要介紹了java中的類型自動轉(zhuǎn)換機(jī)制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 一文掌握Spring Cookie和Session 是什么及區(qū)別介紹

    一文掌握Spring Cookie和Session 是什么及區(qū)別介紹

    Cookie和Session都是用于在客戶端和服務(wù)器之間傳遞信息的技術(shù),但它們的工作方式和使用場景有所不同,Cookie是在客戶端保存用戶信息的一種機(jī)制,而Session是在服務(wù)器端保存用戶信息的一種機(jī)制,本文介紹Spring Cookie和Session 是什么,感興趣的朋友一起看看吧
    2025-01-01
  • eclipse/intellij idea 查看java源碼和注釋方法

    eclipse/intellij idea 查看java源碼和注釋方法

    下面小編就為大家?guī)硪黄猠clipse/intellij idea 查看java源碼和注釋方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • QueryWrapper中or的使用技巧分享

    QueryWrapper中or的使用技巧分享

    在日常的開發(fā)工作中,處理數(shù)據(jù)庫查詢是一個非常常見的任務(wù),尤其是當(dāng)我們需要在復(fù)雜條件下篩選數(shù)據(jù)時,如何編寫高效、簡潔且可維護(hù)的查詢邏輯顯得尤為重要,本文給大家介紹了QueryWrapper中or的使用技巧,需要的朋友可以參考下
    2024-10-10
  • Spring?Boot?項目中?JPA?語法的基本使用方法

    Spring?Boot?項目中?JPA?語法的基本使用方法

    這篇文章主要介紹了?Spring?Boot?項目中?JPA?語法的基本使用方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • SpringBoot集成FastDFS依賴實現(xiàn)文件上傳的示例

    SpringBoot集成FastDFS依賴實現(xiàn)文件上傳的示例

    這篇文章主要介紹了SpringBoot集成FastDFS依賴實現(xiàn)文件上傳,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Java動態(tài)線程池插件dynamic-tp集成過程淺析

    Java動態(tài)線程池插件dynamic-tp集成過程淺析

    這篇文章主要介紹了Java動態(tài)線程池插件dynamic-tp集成過程,dynamic-tp是一個輕量級的動態(tài)線程池插件,它是一個基于配置中心的動態(tài)線程池,線程池的參數(shù)可以通過配置中心配置進(jìn)行動態(tài)的修改
    2023-03-03
  • java 多態(tài)性詳解及常見面試題

    java 多態(tài)性詳解及常見面試題

    這篇文章主要介紹了java 多態(tài)性詳解及常見面試題的相關(guān)資料,這里對java 的多態(tài)性做了資料整理,并列舉常見的關(guān)于多態(tài)性的面試題,需要的朋友可以參考下
    2016-11-11
  • SVN出現(xiàn)提示org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir解決方案

    SVN出現(xiàn)提示org.apache.subversion.javahl.ClientException: Attempt

    這篇文章主要介紹了SVN出現(xiàn)提示org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir解決方案的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • SpringBoot實現(xiàn)子類的反序列化示例代碼

    SpringBoot實現(xiàn)子類的反序列化示例代碼

    這篇文章主要給大家介紹了關(guān)于SpringBoot實現(xiàn)子類的反序列化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用SpringBoot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評論

富川| 南雄市| 宿州市| 辽阳市| 焦作市| 福建省| 越西县| 乐平市| 康定县| 日照市| 南开区| 兴山县| 略阳县| 石门县| 三江| 庆云县| 旅游| 鹰潭市| 五河县| 绥化市| 祁门县| 吕梁市| 莆田市| 旌德县| 黄浦区| 台中县| 新化县| 伊春市| 会东县| 蛟河市| 余庆县| 蒲江县| 丹江口市| 泸州市| 集安市| 剑河县| 沽源县| 方城县| 土默特右旗| 合水县| 云梦县|