Java Stream API 詳解(Java 8+)

1. Stream 操作分類

Stream 操作分為兩類:

  1. 中間操作(Intermediate Operations)

    • 返回新的?Stream,可以鏈式調用(如?filter,?map,?sorted,?distinct)。

    • 惰性求值:只有遇到終止操作時才會執行。

  2. 終止操作(Terminal Operations)

    • 返回非?Stream?結果(如?collect,?count,?sum,?forEach)。

    • 觸發計算,執行所有中間操作。


2. 常用 Stream 操作

(1) 過濾:filter(Predicate<T>)

作用:篩選符合條件的元素。
示例:篩選以?"a"?開頭的字符串。

java

List<String> list = List.of("apple", "banana", "avocado", "orange");
List<String> filtered = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
// 結果:["apple", "avocado"]

(2) 映射:map(Function<T, R>)

作用:將元素轉換為另一種形式(如大小寫轉換、提取字段)。
示例:所有字符串轉為大寫。

java

List<String> upper = list.stream().map(String::toUpperCase).collect(Collectors.toList());
// 結果:["APPLE", "BANANA", "AVOCADO", "ORANGE"]

提取對象屬性

java

List<Person> people = ...;
List<String> names = people.stream().map(Person::getName).collect(Collectors.toList());

(3) 排序:sorted()?/?sorted(Comparator<T>)

作用:按自然順序或自定義比較器排序。
示例:按字母順序排序。

java

List<String> sorted = list.stream().sorted().collect(Collectors.toList());
// 結果:["apple", "avocado", "banana", "orange"]

自定義排序(按字符串長度):

java

List<String> sortedByLength = list.stream().sorted(Comparator.comparing(String::length)).collect(Collectors.toList());
// 結果:["apple", "banana", "orange", "avocado"]

(4) 去重:distinct()

作用:去除重復元素(依賴?equals()?和?hashCode())。
示例

java

List<String> withDuplicates = List.of("a", "b", "a", "c");
List<String> distinct = withDuplicates.stream().distinct().collect(Collectors.toList());
// 結果:["a", "b", "c"]

(5) 聚合操作

計數:count()

java

long count = list.stream().count(); // 4
求和:mapToInt()?+?sum()

java

List<String> numbers = List.of("1", "2", "3");
int sum = numbers.stream().mapToInt(Integer::parseInt).sum(); // 6
求最大值/最小值

java

Optional<String> max = list.stream().max(Comparator.naturalOrder());
Optional<String> min = list.stream().min(Comparator.comparing(String::length));
匹配檢查
  • anyMatch(Predicate<T>)(任一元素匹配)

  • allMatch(Predicate<T>)(所有元素匹配)

  • noneMatch(Predicate<T>)(無元素匹配)

java

boolean hasA = list.stream().anyMatch(s -> s.contains("a")); // true

3. 終止操作:collect(Collectors.toList())

collect()?是常用的終止操作,用于將流轉換為集合或其他數據結構。
常見?Collectors?方法

方法作用
Collectors.toList()轉為?List
Collectors.toSet()轉為?Set(自動去重)
Collectors.joining(delimiter)拼接字符串
Collectors.groupingBy(Function)按條件分組
Collectors.partitioningBy(Predicate)按條件分區(true/false)

示例

java

// 拼接字符串
String joined = list.stream().collect(Collectors.joining(", "));
// 結果:"apple, banana, avocado, orange"// 分組(按首字母)
Map<Character, List<String>> grouped = list.stream().collect(Collectors.groupingBy(s -> s.charAt(0)));
// 結果:{'a': ["apple", "avocado"], 'b': ["banana"], 'o': ["orange"]}

4. 并行流(Parallel Stream)

通過?parallelStream()?利用多核 CPU 加速計算(適合大數據量)。
示例

java

List<String> parallelProcessed = list.parallelStream().map(String::toUpperCase).collect(Collectors.toList());

注意

  • 并行流不保證順序。

  • 小數據量可能更慢(線程開銷)。


5. 完整示例

java

List<String> fruits = List.of("apple", "banana", "avocado", "orange", "apple");// 過濾 + 映射 + 去重 + 排序
List<String> result = fruits.stream().filter(s -> s.length() > 5)       // 篩選長度 >5.map(String::toUpperCase)          // 轉大寫.distinct()                        // 去重.sorted()                          // 排序.collect(Collectors.toList());     // 轉為 List// 結果:["AVOCADO", "BANANA", "ORANGE"]

6. 總結

操作方法示例
過濾filter(Predicate).filter(s -> s.startsWith("a"))
映射map(Function).map(String::toUpperCase)
排序sorted().sorted(Comparator.reverseOrder())
去重distinct().distinct()
聚合count(),?sum().mapToInt(Integer::parseInt).sum()
收集collect(Collectors.toList()).collect(Collectors.joining(", "))

適用場景

  • 需要對集合進行復雜處理(如過濾、轉換、分組)。

  • 代碼可讀性比性能更重要(小數據量)。

  • 并行流適合大數據計算(如日志分析、批量處理)。

傳統循環 vs Stream

java

// 傳統方式(繁瑣)
List<String> filtered = new ArrayList<>();
for (String s : list) {if (s.startsWith("a")) {filtered.add(s.toUpperCase());}
}// Stream 方式(簡潔)
List<String> filtered = list.stream().filter(s -> s.startsWith("a")).map(String::toUpperCase).collect(Collectors.toList());

Stream API 讓代碼更符合?“做什么”?而非?“怎么做”?的編程風格,推薦在 Java 8+ 項目中廣泛使用!

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

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

相關文章

「源力覺醒 創作者計劃」_文心大模型4.5系列開源模型, 從一行代碼到一個生態:聊聊開源戰略那些事兒,順便扯扯文心大模型 4.5 的使用心得

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄從一行…

算法專題(二)回文鏈表

1、源代碼class Solution {public boolean isPalindrome(ListNode head) {ListNode fasthead,slowhead; //快慢指針都在頭結點//快指針走2步&#xff0c;慢指針走一步。//雙數快指針最后是null&#xff0c;單數快指針下一位是nullwhile(fast!null && fast.next!null){f…

2025《艾諾提亞失落之歌》逆向工程解包嘗試

前言 想開發一下光明之魂&#xff0c;看能不能解包《艾諾提亞失落之歌》的模型。 之前寫了&#xff08;https://blog.csdn.net/weixin_42875245/article/details/148616547?spm1001.2014.3001.5501&#xff09; 沿用這個思路進行逆向工程解包。 文章目錄請添加圖片描述前言…

JVM 03 類加載機制

JVM 將字節碼二進制流加載到內存稱為類加載。 什么時候加載類 new 實例化對象。而對象所屬類還沒被加載。讀取/設置類的靜態非常量字段&#xff0c;常量字段在常量池。調用類的靜態方法。類初始化&#xff0c;優先初始化父類。虛擬機啟動時&#xff0c;先加載用戶指定的主類。 …

STM32H7+FreeRTOS+LwIP移植EtherCAT開源主站SOEM

代碼下載什么的就不多說了&#xff0c;直接看需要移植修改的代碼。 1、osal.c修改 /******************************************************************************* * *** **** *** *** …

VijosOJ:中文信息學競賽的二十年開源之路

VijosOJ&#xff1a;中文信息學競賽領域的老牌開源在線判題系統 在中文編程教育與信息學競賽的發展歷程中&#xff0c;在線判題系統&#xff08;OJ&#xff09;扮演了至關重要的角色。它們不僅是選手訓練的 “戰場”&#xff0c;更是知識傳遞與社區交流的樞紐。VijosOJ&#x…

QPainter::CompositionMode解析

基本概念目標(Destination)&#xff1a;已經存在的像素。源(Source)&#xff1a;要繪制的新像素。組合模式&#xff1a;決定源和目標如何混合。總結SourceOver&#xff1a;源繪制在目標之上。DestinationOver&#xff1a;目標繪制在源之上。Clear&#xff1a;二者重疊區域被清空…

對接釘釘審批過程記錄(C#版本)

釘釘開放平臺&#xff1a;API總覽 - 釘釘開放平臺 按照開放平臺操作指引&#xff0c;進入到釘釘開發者后臺&#xff1a;開發者后臺統一登錄 - 釘釘統一身份認證&#xff0c;進行應用創建。 按照開放平臺指引下載釘釘SDK&#xff08;新版&#xff09;。 在vs引入釘釘dll文件。 獲…

AFSIM入門教程03.03:更新所有依賴庫版本

系列索引&#xff1a;AFSIM入門教程索引 上一篇中更新了tiff庫版本&#xff0c;本文將更新所有使用到的依賴庫版本。 失敗了 依賴庫 首先獲取哪些庫被使用了。打開源碼目錄&#xff0c;搜索# Configure the 3rd_party&#xff0c;可以看到調用第三方庫的代碼。 官方提供的…

完美解決hive external表中csv字段內容含“,“逗號的問題

為解決hive表中csv字段內容含","逗號的問題&#xff0c;網上幾乎都是說要用org.apache.hadoop.hive.serde2.OpenCSVSerde。 使用方法為&#xff1a; 1、mysql導出時&#xff0c;加一個ENCLOSED BY ‘"’&#xff0c; 示例&#xff1a; mysql -h 10.16.0.10 -P …

【Git】修改本地和遠程的分支名稱

其原理是&#xff1a; 對于本地&#xff1a;可直接修改分支名稱&#xff1b;對于遠程&#xff1a;不可直接重命名分支&#xff0c;所以應該將修改好名稱的分支以新分支的形式推送上遠程倉庫&#xff0c;之后將新分支與遠程新分支關聯&#xff0c;之后可選擇刪除舊分支# 例子&am…

ubuntu24.04安裝selenium、chrome、chromedriver

實驗環境&#xff1a;kaggle notebook、colab notebook1、安裝chrome!wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb!sudo dpkg -i google-chrome-stable_current_amd64.deb!sudo apt-get install -f!export QT_QPA_PLATFORMoffscreen!sudo…

西門子PLC基礎指令6:讀取時鐘指令、設置時鐘指令、使能含義與注意

讀/寫指令 1. 讀取時鐘 指令 READ_RTCREAD_RTC &#xff08;RTC 全稱是 Real - Time Clock&#xff0c;即實時時鐘 &#xff09;指令的主要作用是將 CPU 內部實時時鐘&#xff08;RTC&#xff09;的當前日期和時間信息讀取出來&#xff0c;并存儲到以指定字節地址&#xff08;圖…

GeoTools 結合 OpenLayers 實現緩沖區分析

前言? 緩沖區分析是地理信息系統&#xff08;GIS&#xff09;空間分析的核心功能之一。它通過圍繞點、線或面等地理實體&#xff0c;自動生成指定距離&#xff08;或寬度&#xff09;的等距區域&#xff08;緩沖區&#xff09;。該功能為量化空間鄰近度、評估影響范圍、識別潛…

SpringBoot 接入SSE實現消息實時推送的優點,原理以及實現

SpringBoot 接入SSE實現消息實時推送的優點,原理以及實現 前言 上一篇文章 我寫的關于SpringBoot整合t-io是websocket實時通信的文章中我們可以了解到 websocket是雙向通信的,而且需要TCP連接的支持,今天在這里我要說的SSE(Server-Sent Events) 是一個單項通信的消息實時推…

創建型設計模式:對象誕生的藝術與智慧

&#x1f3ad; 創建型設計模式&#xff1a;對象誕生的藝術與智慧 &#x1f4a1; 溫馨提示&#xff1a;本文將以輕松有趣的方式帶你探索設計模式的世界&#xff0c;就像在聽一個關于"如何優雅地生孩子"的故事一樣&#xff01; &#x1f6aa; 傳送門&#xff1a;在開始…

如何解決pip安裝報錯ModuleNotFoundError: No module named ‘gensim’問題

【Python系列Bug修復PyCharm控制臺pip install報錯】如何解決pip安裝報錯ModuleNotFoundError: No module named ‘gensim’問題 摘要 在使用 PyCharm 2025 進行 Python 開發時&#xff0c;常常需要通過 pip install 安裝第三方包以豐富項目功能。但在安裝 gensim 等包時&…

【嵌入式電機控制#26】BLDC:三相模擬采集

之前有些網友試著用有刷的平均電流法采集三相&#xff0c;還搞了個閉環控制。求&#xff01;結果直接把驅動板給干沒了......做過仿真的朋友們都知道&#xff0c;無刷電機的相電流波形是介于方波和正弦波的。如果拿平均電流去測量&#xff0c;很不靠譜。這節內容為大家分享采集…

ref存儲對象和reactive深度響應式遞歸地對對象的嵌套屬性進行響應式處理

ref 不會遞歸地對 對象 或 數組 中的每個屬性或元素進行深度響應式處理。如果你需要遞歸處理嵌套屬性&#xff0c;reactive 是更適合的選擇。讓我通過具體的例子來展示這一點。 例子&#xff1a;ref 存儲對象和嵌套對象 1. 使用 ref 存儲嵌套對象&#xff1a; import { createA…

小鵬汽車前端面經

前端基礎與瀏覽器機制 (Front-End Fundamentals & Browser Mechanics) 這些問題涵蓋了Web工作的基本原理&#xff0c;包括網絡、渲染和瀏覽器特性。 1. 瀏覽器渲染與性能 (Browser Rendering & Performance) URL輸入發生什么&#xff1f;(What happens when you type a…