java中,stream的filter和list的removeIf篩選速度比較

在 Java 里,Stream 的filter和 List 的removeIf篩選效率要依據具體情形來判斷。

1. 操作本質有別

  • Stream 的 filter
    • 它是一種中間操作,不會立刻執行,而是把篩選條件記錄下來。只有遇到終端操作時,才會開始處理元素。
    • 此操作不會對原集合進行修改,而是生成一個新的流。
  • List 的 removeIf
    • 這是一種終端操作,會立即對原集合進行修改,刪除滿足條件的元素。
    • 它直接在原集合上進行元素的刪除操作。

2. 效率對比分情況

  • 單次篩選場景
    當你只需要對集合進行一次篩選時,removeIf的效率更高。這是因為它直接在原集合上進行操作,避免了創建新的流和中間集合。
  • 鏈式操作場景
    如果需要進行多次篩選或者其他中間操作,Stream 的filter會更高效。因為 Stream 采用延遲執行策略,能將多個操作進行優化合并,減少遍歷次數。

3. 示例與性能測試

下面通過代碼來直觀感受兩者的性能差異:

java

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class FilterVsRemoveIf {public static void main(String[] args) {// 創建一個包含大量元素的列表List<Integer> list = new ArrayList<>();for (int i = 0; i < 1000000; i++) {list.add(i);}// 測試Stream的filterlong startTime = System.currentTimeMillis();List<Integer> filteredList = list.stream().filter(e -> e % 2 == 0).collect(Collectors.toList());long endTime = System.currentTimeMillis();System.out.println("Stream filter耗時: " + (endTime - startTime) + "ms");// 重新創建相同的列表用于測試removeIflist = new ArrayList<>();for (int i = 0; i < 1000000; i++) {list.add(i);}// 測試List的removeIfstartTime = System.currentTimeMillis();list.removeIf(e -> e % 2 != 0);endTime = System.currentTimeMillis();System.out.println("List removeIf耗時: " + (endTime - startTime) + "ms");}
}

測試結果分析

  • Stream 的 filter:由于要創建流、中間集合以及進行終端操作,會帶來一些額外的開銷。
  • List 的 removeIf:直接在原集合上進行操作,無需創建新的集合,所以速度更快。

4. 如何選擇

  • 選擇 Stream 的 filter 的情況
    • 你不想對原集合進行修改。
    • 需要進行鏈式操作,比如多次篩選、映射等。
    • 希望代碼更加簡潔易讀。
  • 選擇 List 的 removeIf 的情況
    • 你想直接修改原集合。
    • 只需要進行一次篩選操作。
    • 追求更高的性能。

綜上所述,在單次篩選且需要修改原集合時,removeIf是更好的選擇;而在需要鏈式操作或者保留原集合的場景下,filter更為合適。結合本人使用心得,當你使用當前處理器與其他處理器公用一個傳入變量時,使用流式處理,不要操作原對象;僅有當前處理器時,建議使用list自有方法,因為它速度更快。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89832.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python(28)Python循環語句指南:從語法糖到CPython字節碼的底層探秘

目錄 引言一、推導式家族全解析1.1 基礎語法對比1.2 性能對比測試 二、CPython實現揭秘2.1 字節碼層面的秘密2.2 臨時變量機制 三、高級特性實現3.1 嵌套推導式優化3.2 條件表達式處理 四、性能優化指南4.1 內存使用對比4.2 執行時間優化技巧 五、最佳實踐建議六、總結&#x1…

深度分析:Microsoft .NET Framework System.Random 的 C++ 復刻實現

深度分析&#xff1a;Microsoft .NET Framework Random 的 C 復刻實現 核心原理與算法結構 本實現基于 Knuth 減隨機數生成器&#xff08;Subtractive Random Number Generator&#xff09;&#xff0c;是 .NET Framework 中 System.Random 的精確復刻。其核心特點包括&#x…

[論文閱讀] 人工智能 | 在非CUDA硬件上運行幾何學習:基于Intel Gaudi-v2 HPU的PyTorch框架移植實踐

在非CUDA硬件上運行幾何學習&#xff1a;基于Intel Gaudi-v2 HPU的PyTorch框架移植實踐 論文標題&#xff1a;PyTorch-based Geometric Learning with Non-CUDA Processing Units: Experiences from Intel Gaudi-v2 HPUs arXiv:2507.01031 (cross-list from cs.LG) PyTorch-ba…

Python-多線程-threading

1 需求 2 接口 3 示例 4 參考資料 Python treading 模塊 | 菜鳥教程

2025年- H91-Lc199-- 62.不同路徑(多維動態規劃)--Java版

1.題目描述 2.思路 dp含義&#xff1a;代表到當前位置的路徑數 遞推公式&#xff1a;dp[i][j]dp[i-1][j]dp[i][j-1] dp數組初始化&#xff0c;我們要確保第一行和第一列是有值的. dp數組的遍歷順序&#xff1a;我們需要從左往右遍歷&#xff0c;從上往下遍歷。并且把第一行和第…

char 不是 Java 中的 2 字節(16 位)嗎? 為什么用 UTF-8 編碼寫入時,一個中文要占 3 個字節?

char 不是 Java 中的 2 字節&#xff08;16 位&#xff09;嗎&#xff1f; 為什么用 UTF-8 編碼寫入時&#xff0c;一個中文要占 3 個字節&#xff1f; ? 一、Java 中的 char 是什么&#xff1f; Java 的 char 是一個 固定大小的 2 字節&#xff08;16 位&#xff09;類型&am…

【Elasticsearch】檢索排序 分頁

檢索排序 & 分頁 1.測試數據準備2.排序功能2.1 簡單字段排序2.2 多字段排序2.3 日期排序 3.分頁功能3.1 基礎分頁3.2 深度分頁&#xff08;不推薦大數據量使用&#xff09;3.3 使用 search_after 進行高效分頁 4.綜合示例&#xff1a;高亮排序分頁5.實踐建議 1.測試數據準備…

Delta、Jackknife、Bootstrap

用班級平均身高的案例&#xff0c;展示 ?Delta、Jackknife、Bootstrap? 的完整計算過程。 ?0. 數據準備? ?原始數據&#xff08;4個學生的身高&#xff09;??&#xff1a; 真實均值&#xff08;目標統計量&#xff09;??&#xff1a; ?1. Delta 方法&#xff08;公式…

企業智腦技術架構設計:緊貼企業場景規劃面向未來的發展趨勢與實現路徑

摘要 本文深入探討了企業智腦技術架構的設計理念與發展趨勢&#xff0c;分析了當前企業智能化轉型的技術需求與挑戰&#xff0c;提出了一個面向未來的企業智腦技術架構設計方案。文章從底層技術支撐、核心能力構建、應用場景適配、安全合規保障以及未來發展路徑五個維度展開論…

新手向:Python方向講解

從NASA火星任務到TikTok推薦算法&#xff0c;從自動化腳本到量子計算&#xff0c;Python用import antigravity重新定義了編程邊界 一、設計哲學&#xff1a;優雅明確的編程禪學 Python之禪&#xff08;import this&#xff09;&#xff1a; 優美勝于丑陋&#xff08;Beautifu…

Chrome谷歌瀏覽器插件ModHeader,修改請求頭,開發神器

文章目錄一、介紹與下載二、使用一、介紹與下載 ModHeader顧名思義就是讓我們可以自定義HTTP請求頭或者是重寫響應頭&#xff0c;包括新增請求頭/響應頭或者覆蓋Chrome瀏覽器設置的請求頭的默認值&#xff0c;同時還可以根據URL Pattern來只對特定網站生效。 有條件的同學可以…

SEW:無監督預訓練在語音識別中的性能-效率權衡

摘要 本文研究了自動語音識別&#xff08;ASR&#xff09;中預訓練模型的性能-效率權衡問題。我們聚焦于 wav2vec 2.0&#xff0c;并形式化了多種影響模型性能和效率的架構設計。基于所有觀察結果&#xff0c;我們提出了 SEW&#xff08;Squeezed and Efficient Wav2vec&#…

linux系統部署express+vue項目

一、準備階段&#xff1a; 1、安裝linux上所需要的環境&#xff1a;npm nodejs nginx pm2 //安裝 npm&#xff08;Node 包管理器&#xff09; sudo apt install npm//判斷是否安裝成功 npm -v//安裝 Node.js&#xff08;可以根據需要選擇版本&#xff09; sudo apt inst…

PixiJS教程(004):點擊事件交互

1.6 事件交互實現要求&#xff1a;點擊寶劍&#xff0c;修改寶劍的顏色。1??實現代碼&#xff1a; // 為精靈添加交互事件 sprite.interactive true; sprite.on(click, () > {// 點擊精靈時&#xff0c;改變精靈的顏色sprite.tint Math.random() * 0xFFFFFF; });說明&am…

創客匠人助力家庭教育IP破局:從0到1打造創始人個人品牌全攻略

一、IP定位&#xff1a;細分賽道的精準錨定與用戶畫像構建 在家庭教育8000億市場規模的競爭中&#xff0c;創始人IP的差異化定位成為破局關鍵。創客匠人通過“標簽化定位”工具&#xff0c;幫助教育者鎖定垂直領域&#xff0c;如親子溝通、青春期教育等細分賽道。以景麗霞老師…

使用堅果云擴容Zotero同步空間的簡單快捷方法

本文介紹基于堅果云的WebDAV協議&#xff0c;用于文獻管理軟件Zotero的文件同步&#xff0c;從而實現Zotero存儲空間擴容的方法。 在之前的文章Zotero文獻管理軟件入門使用方法&#xff1a;軟件下載、文獻導入、引文插入&#xff08;https://blog.csdn.net/zhebushibiaoshifu/a…

Java啟動腳本

Java啟動腳本 編寫代碼&#xff0c;然后打包 Java-1.0-SNAPSHOT.jar public class test {public static void main(String[] args) {System.out.println("Hello IDEA");} }編寫運行腳本 #!/bin/sh WORKDIR$(cd $(dirname $0); pwd) cd $WORKDIRexport JAVA_OPTS"…

VSCode使用ssh遠程連接阿里云

1. 終端選擇 Windows使用PowerShell Ubuntu和Mac使用Terminal 2. 設置ssh 2.1. 第一臺電腦 生成密鑰 ssh-keygen -o -t rsa -b 4096 -C "emailexample.com" 按三次回車 查看密鑰 cat ~/.ssh/id_rsa.pub 拷貝密鑰&#xff0c;粘貼到服務器的密鑰框中 2.2. 第…

XLSR-Wav2Vec2:用于語音識別的無監督跨語言表示學習

摘要 本文提出了 XLSR&#xff0c;該方法通過從多種語言的原始語音波形中預訓練單個模型&#xff0c;以學習跨語言的語音表示。我們基于 wav2vec 2.0 構建模型&#xff0c;該方法通過對掩蔽后的潛在語音表示解決對比任務進行訓練&#xff0c;并聯合學習在多種語言之間共享的潛…

圖靈完備之路(數電學習三分鐘)----數據選擇器與總線

1.數據選擇器之前我們學習了邏輯與算數的計算&#xff0c;得知兩個數字之間的加減和與或的結果是不同的&#xff0c;而一個通用的數字電路不可能只有一個功能&#xff0c;所以我們將在本節引入電路選擇器這一“器件”&#xff0c;來實現對兩個輸入的運算方式的選擇&#xff0c;…