關于(stream)流

Stream 是 Java 8 引入的一個強大的功能,用于處理集合(Collection)或數組中的數據。它提供了一種聲明式的編程方式,可以極大地簡化對數據的操作,例如過濾、排序、映射和聚合等。



1. 什么是 Stream 流?

  • 定義Stream 是一個來自數據源(如集合、數組等)的元素序列,支持順序和并行操作。
  • 特點
    • 惰性求值(Lazy Evaluation):Stream 的中間操作不會立即執行,只有在終端操作觸發時才會真正執行。
    • 不可變性:Stream 操作不會修改原始數據源,而是生成新的流或結果。
    • 鏈式調用:多個操作可以通過鏈式調用的方式組合在一起。


2. Stream 的工作流程

使用 Stream 流通常分為以下三個步驟:

  1. 創建流:從數據源(如集合、數組)創建一個 Stream。
  2. 中間操作:對流中的數據進行一系列操作(如過濾、映射、排序等),返回一個新的流。
  3. 終端操作:觸發流的執行,并生成最終結果(如收集到集合、計算總數等)。


3. 創建 Stream

可以通過多種方式創建 Stream:

(1)從集合創建
List<String> list = Arrays.asList("A", "B", "C");
Stream<String> stream = list.stream(); // 創建串行流
Stream<String> parallelStream = list.parallelStream(); // 創建并行流
(2)從數組創建
String[] array = {"A", "B", "C"};
Stream<String> stream = Arrays.stream(array);
(3)使用靜態方法
// 創建一個包含指定元素的流
Stream<String> stream = Stream.of("A", "B", "C");// 創建一個空流
Stream<String> emptyStream = Stream.empty();


4. 中間操作

中間操作是對流中的數據進行處理,返回一個新的流。常見的中間操作包括:

(1)過濾(filter
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 過濾出偶數
Stream<Integer> filteredStream = numbers.stream().filter(n -> n % 2 == 0);
(2)映射(map
List<String> words = Arrays.asList("apple", "banana", "cherry");// 將每個單詞轉換為大寫
Stream<String> upperCaseStream = words.stream().map(String::toUpperCase);
(3)排序(sorted
List<Integer> numbers = Arrays.asList(5, 3, 8, 1);// 升序排序
Stream<Integer> sortedStream = numbers.stream().sorted();// 自定義排序規則
Stream<Integer> customSortedStream = numbers.stream().sorted(Comparator.reverseOrder());
(4)去重(distinct
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4);// 去重后的流
Stream<Integer> distinctStream = numbers.stream().distinct();
(5)限制和跳過(limitskip
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 取前 3 個元素
Stream<Integer> limitedStream = numbers.stream().limit(3);// 跳過前 2 個元素
Stream<Integer> skippedStream = numbers.stream().skip(2);


5. 終端操作

終端操作會觸發流的執行,并生成最終結果。常見的終端操作包括:

(1)收集結果(collect
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 收集為 List
List<Integer> result = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());// 收集為 Set
Set<Integer> resultSet = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toSet());
(2)統計信息(countminmax 等)
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 統計元素個數
long count = numbers.stream().count();// 查找最大值
Optional<Integer> max = numbers.stream().max(Integer::compareTo);// 查找最小值
Optional<Integer> min = numbers.stream().min(Integer::compareTo);
(3)遍歷(forEach
List<String> words = Arrays.asList("apple", "banana", "cherry");// 打印每個單詞
words.stream().forEach(System.out::println);
(4)判斷條件(anyMatchallMatchnoneMatch
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 是否存在偶數
boolean hasEven = numbers.stream().anyMatch(n -> n % 2 == 0);// 是否所有元素都是偶數
boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0);// 是否沒有偶數
boolean noEven = numbers.stream().noneMatch(n -> n % 2 == 0);


6. 并行流

Java 8 提供了并行流(Parallel Stream),可以利用多核 CPU 并行處理數據:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用并行流計算總和
int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();
  • 優點:對于大數據量的操作,可以顯著提高性能。
  • 缺點:并行流可能會引入線程安全問題,且不一定總是比串行流快。


7. Stream 的注意事項

  • 一次性消費:Stream 流只能被消費一次,再次使用需要重新創建。
  • 避免副作用:盡量避免在 Stream 操作中修改外部狀態,保持函數式編程的純函數特性。
  • 性能優化:合理選擇中間操作和終端操作,避免不必要的復雜操作。


8. 總結

Stream 是 Java 8 中非常重要的特性,能夠極大地簡化集合操作。它的主要優勢包括:

  • 簡潔性:通過鏈式調用實現復雜的操作邏輯。
  • 可讀性:代碼更加直觀,易于理解。
  • 高效性:支持并行流,充分利用多核 CPU 性能。

如果你需要處理集合或數組中的數據,推薦優先考慮使用 Stream 流來實現

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

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

相關文章

結課作業自選01. 內核空間 MPU6050 體感鼠標驅動程序(二)(完整實現流程)

目錄 一. 題目要求-內核空間 MPU6050 體感鼠標驅動程序 二. 偽代碼及程序運行流程 三. 主要函數詳解&#xff08;根據代碼流程進行詳解&#xff09; 3.1 module_i2c_driver宏&#xff08;對應“1”&#xff09; 3.2 mpu_of_match設備樹匹配表&#xff08;對應“2”&#x…

5G 核心網切換機制全解析:XN、N2 與移動性注冊對比

摘要 本文深入探討了 5G 核心網中的三種關鍵切換方式:基于 XN 接口的切換、基于 N2 接口的切換以及移動性注冊更新機制。通過對比分析它們的原理、應用場景和技術差異,幫助讀者全面理解 5G 網絡中用戶移動性管理的核心技術。 1. 引言 隨著 5G 技術的廣泛應用,用戶對網絡連…

用深度學習提升DOM解析——自動提取頁面關鍵區塊

一、時間軸&#xff1a;一次“抓不到重點”的二手車數據爬蟲事故 2025/03/18 09:00 產品經理希望抓取懂車帝平臺上“北京地區二手車報價”作為競品監測數據源。我們初步使用傳統XPath方案&#xff0c;試圖提取車型、年限、里程、價格等數據。2025/03/18 10:00 初版腳本運行失敗…

React與Vue的內置指令對比

React 與 Vue 不同&#xff0c;它沒有內置的模板指令系統。React 采用了 JavaScript 優先 的聲明式方式&#xff0c;使用 JSX 語法將 HTML 和 JavaScript 結合在一起。因此&#xff0c;React 中沒有類似 Vue 的 v-if、v-for、v-bind 等內置指令。 React 中的替代方案 條件渲染…

Spring聲明式事務源碼全鏈路剖析與設計模式深度解讀

Spring聲明式事務源碼全鏈路剖析與設計模式深度解讀 作者&#xff1a;AI 日期&#xff1a;2025-05-22 一、前言 Spring事務是企業級開發的基石&#xff0c;但“為什么有時事務失效&#xff1f;”、“不同傳播行為背后發生了什么&#xff1f;”、“Spring事務源碼到底如何實現&…

云原生安全基礎:深入探討容器化環境中的權限隔離與加固策略

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 在云原生環境中&#xff0c;容器化技術&#xff08;如 Docker 和 Kubernetes&#xff09;的廣泛應用帶來了靈活性與效率&#xff0c;但也引入了新的安全挑…

如何在 ONLYOFFICE 演示文稿中調整段落首行縮進

在制作演示文稿時&#xff0c;保持內容的一致性與可讀性至關重要&#xff0c;而段落首行縮進作為格式設置的關鍵環節&#xff0c;直接影響著整體呈現效果。在本文中&#xff0c;我們將介紹如何通過創建 ONLYOFFICE 宏&#xff0c;快速設置演示文稿中所有段落的首行縮進。 關于 …

[Asp.Net]GridView、Repeater 導出Excel長數字顯示成科學計數

類似身份證純數字的格式時 &#xff0c;excel默認是數字格式 變成了科學計數法 &#xff0c; GridView:RowDataBound 添加e.Row.Cells[2].Attributes.Add(“style”, “vnd.ms-excel.numberformat:;”); protected void GridView1_RowDataBound(object sender, GridViewRowE…

Ntfs!NtfsReadBootSector函數分析之nt!CcGetVacbMiss中得到一個nt!_VACB結構

第一部分&#xff1a; 1: kd> g Breakpoint 3 hit nt!CcGetVacbMiss: 80a1a19e 6a30 push 30h 1: kd> kc # 00 nt!CcGetVacbMiss 01 nt!CcGetVirtualAddress 02 nt!CcMapData 03 Ntfs!NtfsMapStream 04 Ntfs!NtfsReadBootSector Ntfs…

Linux10正式版發布,擁抱AI了!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中國DBA聯盟(ACDU)成員&#xff0c;10余年DBA工作經驗 Oracle、PostgreSQL ACE CSDN博客專家及B站知名UP主&#xff0c;全網粉絲10萬 擅長主流Oracle、MySQL、PG、高斯…

關于 SSE(Server-Sent Events)過程的簡要解剖

Js前端&#xff1a;發送普通請求 fetch(...) .then(()>{}) .catch(()>{})Java后端&#xff1a;接收請求后調用請求處理函數&#xff0c;函數返回一個emiiter對象 public SseEmitter handleRequest(...) {// 創建一個 SseEmitter 對象&#xff0c;用于發送 SSE 事件SseE…

PyTorch 中unsqueeze(-1)用法

unsqueeze(-1) 是 PyTorch 中的一個張量操作&#xff0c;用于?在指定維度上增加一個長度為1的維度?&#xff08;即擴展維度&#xff09;。具體解析如下&#xff1a; 功能說明 ?作用位置? -1 表示在張量的?最后一個維度?后添加新維度。 &#xff08;等價于 dimlen(tensor.…

RTC技術

什么是RTC RTC&#xff08;Real time communication&#xff09;實時通信&#xff0c;是實時音視頻的一個簡稱&#xff0c;我們常說的RTC技術一般指的是WebRTC技術&#xff0c;已經被 W3C 和 IETF 發布為正式標準。由于幾乎所有主流瀏覽器都支持 WebRTC 標準 API &#xff0c;…

vue+cesium示例:3Dtiles三維模型高度調整(附源碼下載)

接到一位知識星友的邀請&#xff0c;實現他需要3Dtiles三維模型的簡單高度調整需求&#xff0c;適合學習Cesium與前端框架結合開發3D可視化項目。 demo源碼運行環境以及配置 運行環境&#xff1a;依賴Node安裝環境&#xff0c;demo本地Node版本:推薦v18。 運行工具&#xff1a;…

詳解3DGS

4 可微分的3D高斯 splatting 核心目標與表示選擇 我們的目標是從無法線的稀疏SfM點出發&#xff0c;優化出一種能夠實現高質量新視角合成的場景表示。為此&#xff0c;我們選擇3D高斯作為基本圖元&#xff0c;它兼具可微分的體表示特性和非結構化的顯式表示優勢&#xff0c;既…

構建版本沒mac上傳APP方法

在蘋果開發者的app store connect上架Ios應用的時候&#xff0c;發現需要使用xode等軟件來上傳iOS的APP。 但是不管是xcode也好&#xff0c;transporter也好&#xff0c;還是命令行工具也好&#xff0c;都必須安裝在mac電腦才能使用&#xff0c;。 假如沒有mac電腦&#xff0…

Gitee PPM:智能化項目管理如何重塑軟件工廠的未來格局

在數字化轉型浪潮席卷全球的當下&#xff0c;軟件開發行業正經歷著前所未有的變革。隨著企業項目復雜度呈指數級增長&#xff0c;傳統項目管理方式已難以應對多項目并行、跨團隊協作等挑戰。Gitee項目組合管理&#xff08;PPM&#xff09;作為新一代智能化項目管理解決方案&…

node入門:安裝和npm使用

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、安裝npm命令nvm 前言 因為學習vue接觸的&#xff0c;一直以為node是和vue綁定的&#xff0c;還以為vue跑起來必須要node&#xff0c;后續發現并不是。 看…

單例模式,餓漢式,懶漢式,在java和spring中的體現

目錄 餓漢式單例模式 懶漢式單例模式 Spring中的單例模式 關鍵差異對比 在Java和Spring中的應用場景 手寫案例 單例模式是一種創建型設計模式&#xff0c;其核心在于確保一個類僅有一個實例&#xff0c;并提供一個全局訪問點來獲取該實例。下面將詳細介紹餓漢式和懶漢式…

網絡編程——UDP網絡編程

文章目錄 1、sendto()&#xff0c;recvfrom() 與TCP編程不同的是&#xff1a; 無需建立連接&#xff0c;在recvfrom()阻塞等待客戶端的數據&#xff0c;收到數據后進入do something進行數據的處理。 1、sendto()&#xff0c;recvfrom() ssize_t sendto(int socket, void *mes…