java基礎 流(Stream)

Stream

  • Stream 的核心概念
    • 核心特點
  • Stream 的操作分類
    • 中間操作(Intermediate Operations)
    • 終止操作(Terminal Operations)
  • Stream 的流分類
    • 順序流(Sequential Stream)
    • 并行流(Parallel Stream)
      • 并行流的注意事項
      • 并行流的底層機制
    • 順序流 vs 并行流的對比
    • 順序流和并行流的示例代碼
    • 順序流并行流總結

Stream 的核心概念

Java 8 引入的 Stream API 是一種基于函數式編程的數據處理抽象,允許以聲明式方式操作集合(如過濾、映射、排序等)。Stream 不是數據結構,而是對數據源(集合、數組、I/O 等)的高效計算工具

核心特點

  • 鏈式調用:通過多個操作(中間操作 + 終止操作)串聯處理數據
  • 惰性求值:中間操作(如 filter, map)不會立即執行,直到遇到終止操作(如 collect, forEach)
  • 不可復用:一個 Stream 只能被消費一次,再次使用會拋出 IllegalStateException
  • 并行處理:可通過簡單方法(parallel())實現多線程并行計算

Stream 的操作分類

中間操作(Intermediate Operations)

返回新的 Stream,支持鏈式調用,常見方法示例:filter(), map(), sorted(), distinct()。

        List<Integer> list = Arrays.asList(1, 2, 2,3);list.stream().distinct().forEach(System.out::println);//用于去除流中的重復元素。list.stream().map(x -> x * x).forEach(System.out::println);//用于對流中的每個元素應用一個函數,并返回一個新的流list.stream().filter(v->v==3).forEach(System.out::println);//用于對流中的元素進行篩選,只保留滿足條件的元素list.stream().flatMap(s -> s.toString().chars().boxed()).forEach(System.out::println);//用于將流中的每個元素轉換為另一個流,然后將這些流連接成一個流list.stream().limit(2).forEach(System.out::println);//用于限制流中元素的數量list.stream().skip(2).forEach(System.out::println);//用于跳過流中前n個元素list.stream().sorted().forEach(System.out::println);//用于對流中的元素進行排序

支持鏈式調用

        list.stream().distinct().filter(v->v==3).sorted().map(x -> x * x).forEach(System.out::println);

但是注意,流中間操作的方法返回的結果依然是流,但是上面為了顯示這些方法使用的樣例里面
forEach(System.out::println)這個是終止操作方法,也就是在forEach方法之前的返回的是流,在使用forEach方法之后返回的又將流轉換非 Stream 結果

終止操作(Terminal Operations)

觸發實際計算,返回非 Stream 結果(如集合、數值、void),常見方法示示例:collect(), forEach(), reduce(), count()

        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");names.stream().forEach(System.out::println);//對流中的每個元素執行指定的操作 這里是打印names.stream() .map(String::toUpperCase).collect(Collectors.toList()).forEach(System.out::println);//將流中的元素收集到一個容器中System.out.println(names.stream().allMatch(s -> s.contains("s")));//allMatch 檢查是否匹配所有元素System.out.println(names.stream().anyMatch(s -> s.contains("a")));//anyMatch 檢查是否至少匹配一個元素System.out.println(names.stream().noneMatch(s -> s.contains("x")));//noneMatch:檢查是否沒有匹配所有元素System.out.println(names.stream().findFirst());//findFirst:返回當前流中的第一個元素System.out.println(names.stream().findAny());//findAny:返回當前流中的任意元素System.out.println(names.stream().count());//count:返回流中元素總數System.out.println(names.stream().max(Comparator.comparingInt(s->s.length())));//max:返回流中最大值System.out.println(names.stream().min(Comparator.comparingInt(s->s.length())));//min:最小值

Stream 的流分類

順序流(Sequential Stream)

默認模式:所有操作在單線程中按順序執行

List<Integer> list = Arrays.asList(1, 2, 3);
Stream<Integer> stream = list.stream(); // 順序流

適用場景:
數據量較小,或操作本身簡單。
需要保證操作順序(如 sorted() 依賴前序操作結果)。

并行流(Parallel Stream)

Stream<Integer> parallelStream = list.parallelStream(); // 并行流Stream<Integer> parallelStream = list.stream().parallel(); // 轉換為并行流

適用場景:
數據量較大,且任務可獨立拆分(無共享狀態或順序依賴)。
操作耗時(如復雜計算、I/O 等待)。

并行流的注意事項

1.線程安全問題
確保操作中使用的 Lambda 表達式或函數是線程安全的(避免共享可變狀態)。
示例錯誤:

List<Integer> result = new ArrayList<>();
list.parallelStream().forEach(result::add); // 并發修改 ArrayList 導致數據錯誤

應使用線程安全的收集器(如 Collectors.toList()):

List<Integer> result = list.parallelStream().collect(Collectors.toList());

2.性能未必更好
并行流需額外開銷(任務拆分、線程調度),對小數據量可能更慢。
測試性能:通過基準測試(如 JMH) 驗證是否適合并行

3.順序依賴操作
如 limit()、findFirst() 在并行流中可能性能更差,需改用無序流

list.parallelStream().unordered().limit(10); // 提升性能

ORDERED是Spliterator的特征值, 特征要求并行流保持元素順序(如 List),改成unordered就是改成序列流,除此之外

并行流的底層機制

1.Spliterator
并行流通過 Spliterator(可拆分迭代器) 將數據源拆分為多個子任務,是 Stream API 并行處理的底層實現

List<String> list = Arrays.asList("Java", "Python", "C++", "Go");// 使用并行流處理
list.parallelStream() // 將數據源拆分為多個子任務.map(String::toUpperCase).forEach(System.out::println);// 輸出(順序不確定,因為并行處理):
// PYTHON
// JAVA
// GO
// C++

2.ForkJoinPool
并行流默認使用公共的 ForkJoinPool(線程數 = CPU 核心數)。通過系統屬性修改默認線程池大小

System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "8");

3.自定義線程池(避免影響全局)

ForkJoinPool customPool = new ForkJoinPool(4);
customPool.submit(() -> list.parallelStream().forEach(...)).get();

順序流 vs 并行流的對比

特性順序流并行流
線程模型單線程多線程(ForkJoinPool 默認線程池)
性能優勢簡單任務、小數據量大數據量、可并行化的復雜任務
開銷高(線程切換、任務拆分/合并)
順序保證嚴格按順序處理不保證順序(除非使用有序操作)
數據源要求無特殊要求數據源需可拆分(如 ArrayList

順序流和并行流的示例代碼

順序流處理

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filtered = names.stream().filter(name -> name.length() > 3).map(String::toUpperCase).collect(Collectors.toList()); // [ALICE, CHARLIE]

并行流處理

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.parallelStream()//通過底層Spliterator拆分為多個子任務.filter(n -> n % 2 == 0).mapToInt(n -> n * 2).sum(); // (2+4+6+8+10)*2 = 60

順序流并行流總結

順序流:簡單、低開銷,適合小數據量或順序敏感操作。
并行流:通過多線程加速處理,適合大數據量和可并行化任務,但需注意線程安全和性能開銷。

選擇策略:
優先使用順序流,僅在必要時(且驗證有效)切換為并行流。
避免在并行流中操作共享可變狀態。

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

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

相關文章

EAL4+ vs EAL7:高安全場景下的等級選擇策略

在數字化浪潮席卷全球的當下&#xff0c;信息安全已然成為各行各業穩健發展的基石。特別是在高安全需求場景中&#xff0c;選擇契合的安全等級成為保障信息資產安全的關鍵。EAL&#xff08;Evaluation Assurance Level&#xff09;評估保障級作為衡量信息技術產品安全保障能力的…

【Java集合】TreeSet、TreeMap源碼解讀

參考筆記&#xff1a;java TreeSet 和 TreeMap 源碼解讀-CSDN博客 目錄 1.前言 2.紅黑樹 2.1 紅黑樹的五大性質 2.2 節點顏色的初始設置 2.3 插入新節后的調整 2.4 刪除結構后的調整 2.5 排序規則 2.6 設計紅黑樹的原因 3.TreeSet簡介、底層實現 3.1 TreeSet簡介 3.…

【C++初學】C++核心編程技術詳解(二):類與繼承

函數提高 3.1 函數默認參數 函數的形參可以有默認值&#xff0c;調用時可以省略這些參數。 示例代碼&#xff1a; int func(int a, int b 10, int c 10) {return a b c; }int main() {cout << "ret " << func(20, 20) << endl;cout <<…

Next.js + Droplet:高并發視頻內容平臺部署與優化擴展實戰

在構建在線服務時&#xff0c;無論你是開發者還是企業技術負責人&#xff0c;擴展性和穩定性始終是繞不開的核心挑戰。尤其在涉及高并發訪問、大量數據傳輸和持續內容分發的場景中&#xff0c;系統架構的設計直接決定了用戶體驗與業務成效。 本文將以視頻點播&#xff08;Video…

Python爬蟲第13節-解析庫pyquery 的使用

目錄 前言 一、pyquery 初始化 1.1 字符串初始化 1.2 URL 初始化 1.3 文件初始化 二、基本 CSS 選擇器 三、pyquery 查找節點 3.1 子節點 3.2 父節點 3.3 兄弟節點 四、遍歷 五、獲取信息 5.1 獲取屬性 5.2 獲取文本 六、節點操作 6.1 addClass 和 removeClass…

【Hadoop入門】Hadoop生態之Pig簡介

1 什么是Pig&#xff1f; 在大數據分析領域&#xff0c;Apache Pig是一個不可忽視的重要工具。Pig是Apache Hadoop生態系統中的一個高級數據分析平臺&#xff0c;它提供了一種稱為Pig Latin的腳本語言&#xff0c;用于簡化大規模數據集的并行處理。Pig的核心思想是將復雜的數據…

python 語言 設計模式

python 語言 設計模式 設計模式是指在軟件開發過程中,針對反復出現的問題所總結歸納出的通用解決方案。以下是一些常見的Python語言設計模式: 目錄 python 語言 設計模式創建型模式結構型模式行為型模式創建型模式 單例模式 定義:保證一個類只有一個實例,并提供一個全局訪…

QT QML布局

一、?錨點布局(Anchors) 通過定義元素與其他元素或父容器的錨點關系實現定位,支持動態調整和邊距控制?。 Rectangle {anchors.left: parent.left // 左對齊父容器anchors.top: parent.top // 頂部對齊父容器anchors.margins: 10 // 統一設置四周邊距width: …

【力扣03】無重復字符的最長子串

題目 給定一個字符串 s &#xff0c;請你找出其中不含有重復字符的 最長 子串 的長度。 示例 1: 輸入: s "abcabcbb" 輸出: 3 解釋: 因為無重復字符的最長子串是 "abc"&#xff0c;所以其長度為 3。示例 2: 輸入: s "bbbbb" 輸出: 1 解釋:…

一文介紹阿里32B推理模型

什么是QwQ-32B&#xff1f; QwQ-32B并非普通的聊天機器人模型&#xff0c;而是推理模型。推理模型專注于邏輯拆解問題、分步推導&#xff0c;并輸出結構化答案。 通過下面的示例&#xff0c;我們可以直觀看到QwQ-32B的思考過程&#xff1a; qwq-32b思考過程 如果你需要寫作輔…

AutoGen深度解析:從核心架構到多智能體協作的完整指南

AutoGen是微軟推出的一個革命性多智能體(Multi-Agent)框架&#xff0c;它通過模塊化設計和靈活的對話機制&#xff0c;極大地簡化了基于大型語言模型(LLM)的智能體系統開發。本文將深入剖析AutoGen的兩個核心模塊——core基礎架構和agentchat多智能體對話系統&#xff0c;帶您全…

HTML的svg元素

<svg>元素 <svg>是一種用于描述二維矢量圖形的 XML 格式&#xff0c;可以直接嵌入 HTML 文檔中。 <svg>基本用法 <svg>的幾種基本用法,包括圓形&#xff0c;正方形&#xff0c;三角形&#xff0c;直線 &#xff0c;折線等 <body><svg widt…

Qt 子項目依賴管理:從原理到實踐的最佳分析:depends還是 CONFIG += ordered

1. 問題背景 在Qt項目開發中&#xff0c;當一個工程包含多個子項目&#xff08;如庫、插件、測試模塊&#xff09;時&#xff0c;如何正確管理它們的構建順序和依賴關系&#xff1f; 如&#xff1a; 在開發一個包含核心庫&#xff08;core&#xff09;、GUI模塊&#xff08;g…

業務冪等性技術架構體系-接口冪等

接口冪等 對于冪等的考慮&#xff0c;主要解決兩點前后端交互與服務間交互。這兩點有時都要考慮冪等性的實現。從前端的思路解決 的話&#xff0c;主要有三種&#xff1a;前端防重、PRG模式、Token機制。 前端防重 通過前端防重保證冪等是最簡單的實現方式&#xff0c;前端相關…

AI工具導航大全 | 2025精選版(持續更新)

&#x1f680; AI工具導航大全 | 2025精選版&#xff08;持續更新&#xff09; 更新日期&#xff1a;2025-04-11 | 適用場景&#xff1a;學術研究 | 辦公提效 | 創意設計 | 開發編程 數據來源&#xff1a;綜合高校實驗室、企業實踐及開發者社區推薦 &#x1f50d; 導航目錄 &…

驅動-內核空間和用戶空間數據交換

內核空間與用戶控件數據交換 前面了解的字符設備中對 file_operations 結構體的進行了填充&#xff0c; 該 結構體的每一個成員都對應著一個系統調用&#xff0c; 例如 read、 write 等&#xff0c; 在字符設備相關的文章中有實驗過對 調用函數進行了標志打印&#xff0c; 并沒…

5G_WiFi_CE_DFS

目錄 一、規范要求 1、法規目錄 2、定義 3、運行模式 4、主/從設備相關的運行行為及具體的動態頻率選擇&#xff08;DFS&#xff09;要求 5、產品角色確定測試項目 6、測試項目 測試項1&#xff1a;信道可用性檢查&#xff08;Channel Availability Check&#xff09; …

Devops之GitOps:什么是Gitops,以及它有什么優勢

GitOps 定義 GitOps 是一種基于版本控制系統&#xff08;如 Git&#xff09;的運維實踐&#xff0c;將 Git 作為基礎設施和應用程序的唯一事實來源。通過聲明式配置&#xff0c;系統自動同步 Git 倉庫中的期望狀態到實際運行環境&#xff0c;實現持續交付和自動化運維。其核心…

【藍橋杯】單片機設計與開發,第十二屆

/*頭文件聲明區*/ #include <STC15F2K60S2.H>//單片機寄存器頭文件 #include <init.h>//初始化底層驅動頭文件 #include <led.h>//led,蜂鳴器,繼電器底層驅動頭文件 #include <key.h>//按鍵底層驅動頭文件 #include <seg.h>//數碼管底層驅動頭…

Vue3連接MQTT作為客戶端

先下載依賴 npx --yes --registry https://registry.npmmirror.com npm install mqtt 在src的api創建 mes.js // 導入axios import axios from axios;// 定義一個變量,記錄公共的前綴, baseURL const baseURL http://localhost:8080; const instance axios.create({ base…