JDK 1.8 Stream API:集合流處理深度解析

JDK 1.8 Stream API:集合流處理深度解析

摘要:Stream API 是 JDK 1.8 的革命性特性,它將集合操作從傳統迭代升級為聲明式函數式處理。Stream API三個階段(創建→中間操作→終端操作)詳解流處理機制,輔以代碼示例與白話解讀,掌握流處理,是Java開發者邁向現代化編程的關鍵一步。


一、流處理核心三階段
  1. 流創建(Source)
    將集合轉化為流管道:

    List<String> list = Arrays.asList("A", "B", "C");
    Stream<String> stream = list.stream(); // 集合→流
    

    白話:就像把一箱零件倒上流水線傳送帶。

  2. 中間操作(Intermediate Operations)
    對數據進行加工處理,延遲執行(不觸發實際計算):

    stream.filter(s -> s.startsWith("A"))  // 過濾.map(String::toLowerCase)         // 轉換.sorted();                        // 排序
    

    白話:流水線上的篩選機、打磨機、排序機,但機器尚未啟動。

  3. 終端操作(Terminal Operations)
    觸發流水線執行并輸出結果:

    long count = stream.count(); // 觸發計算,返回元素數量
    

    白話:按下啟動按鈕,傳送帶開始運轉并輸出成品。

?? 關鍵特性:流不可復用(終端操作后自動關閉),需重新創建。


二、常用中間操作詳解
操作類型方法功能描述白話比喻
篩選過濾filter(Predicate)條件過濾元素質檢員剔除次品
數據類型轉換map(Function)元素類型轉換(如String→Int)零件重新塑形
去重處理distinct()移除重復元素剔除重復零件
長度控制limit(maxSize)截取前N個元素只取前100個零件
排序操作sorted()自然排序按零件編號排序
跳過元素skip(n)跳過前N個元素丟棄前10個零件

集合流(Stream)是函數式編程的核心工具,提供高效的數據處理能力。以下是典型用法和案例:

代碼示例1


List<Integer> numbers = Arrays.asList(3, 1, 4, 1, 5, 9);
numbers.stream().filter(n -> n > 2)      // 篩選大于2的數 → [3,4,5,9].map(n -> n * 2)         // 每個元素×2 → [6,8,10,18].distinct()              // 去重 → [6,8,10,18].sorted()                // 排序 → [6,8,10,18].limit(3);               // 取前3個 → [6,8,10]

示例2 (過濾與映射)

//場景:從數據集中提取特定條件元素并轉換格式
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 過濾長度>3的名字并轉為大寫
List<String> result = names.stream().filter(name -> name.length() > 3)   // 過濾條件.map(String::toUpperCase)            // 轉換操作.collect(Collectors.toList());       // 收集結果// 輸出: [ALICE, CHARLIE, DAVID]

示例3 (聚合計算)


//場景:統計數值集合的聚合值
List<Integer> numbers = Arrays.asList(3, 7, 2, 9, 5);// 計算最大值、總和與平均值
int max = numbers.stream().max(Integer::compare).orElse(0);
int sum = numbers.stream().mapToInt(Integer::intValue).sum();
double avg = numbers.stream().mapToInt(i -> i).average().orElse(0);// 輸出: max=9, sum=26, avg=5.2

示例4 (分組與分區)


//場景:按屬性對對象分組
class Person {String name;int age;// 構造方法省略
}List<Person> people = Arrays.asList(new Person("Alice", 25),new Person("Bob", 30),new Person("Charlie", 25)
);// 按年齡分組
Map<Integer, List<Person>> ageGroup = people.stream().collect(Collectors.groupingBy(p -> p.age));// 輸出: {25=[Alice, Charlie], 30=[Bob]}// 按年齡是否>=30分區
Map<Boolean, List<Person>> partition = people.stream().collect(Collectors.partitioningBy(p -> p.age >= 30));// 輸出: {false=[Alice, Charlie], true=[Bob]}

示例5 (鏈式操作)


//場景:多步驟數據處理流水線
List<String> data = Arrays.asList("a1", "b2", "c3", "a4", "null");// 過濾非空值 -> 提取數字 -> 轉換為整數 -> 求和
int total = data.stream().filter(s -> !s.equals("null"))    // 過濾無效值.map(s -> s.substring(1))          // 提取數字部分.map(Integer::parseInt)            // 轉為整數.reduce(0, Integer::sum);          // 累加求和// 輸出: 1+2+3+4=10

示例6 (并行處理)


//場景:利用多核加速大規模數據處理
List<Integer> largeList = IntStream.range(1, 1000000).boxed().collect(Collectors.toList());// 并行計算平方和
long sumSquares = largeList.parallelStream().mapToLong(n -> n * n).sum();// 輸出: 12+22+...+9999992的求和

示例7 (自定義收集器)


//場景:實現復雜聚合邏輯
//自定義收集器:拼接字符串并添加分隔符
Collector<String, StringBuilder, String> customCollector = Collector.of(StringBuilder::new,                 // 初始容器(sb, s) -> sb.append(s).append("|"), // 累加元素StringBuilder::append,              // 合并容器sb -> sb.deleteCharAt(sb.length()-1).toString() // 最終轉換
);List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");
String merged = fruits.stream().collect(customCollector);// 輸出: "Apple|Banana|Cherry"

三、終端操作:觸發結果輸出
操作類型方法返回值白話比喻
循環遍歷forEach(Consumer)void對每個成品貼標簽
聚合統計count()long統計合格品數量
邏輯判斷anyMatch(Predicate)boolean檢查是否有瑕疵品
極值獲取max(Comparator)Optional找出最大零件
集合轉換collect(Collectors)Collection將成品打包入新箱子
數值計算reduce(BinaryOperator)Optional計算零件總重量

代碼示例

// 判斷是否存在大于10的數
boolean hasLarge = numbers.stream().anyMatch(n -> n > 10); // 轉換為Set去重存儲
Set<Integer> set = numbers.stream().collect(Collectors.toSet());// 求和操作
int sum = numbers.stream().reduce(0, (a, b) -> a + b); 

四、流處理優勢總結
  1. 性能提升:并行流parallelStream()自動利用多核CPU。
    list.parallelStream().forEach(System.out::println); // 并行輸出
    
  2. 代碼簡潔:鏈式調用替代多層循環嵌套。
  3. 函數式思維:聚焦"做什么"而非"如何做"。
  4. 聲明式編程:通過鏈式調用描述處理邏輯,代碼更簡潔
  5. 延遲執行:操作按需觸發,避免不必要的計算
  6. 無狀態性:多數操作不修改源數據,符合函數式原則

💡 適用場景:大數據集過濾轉換、統計報表生成、鏈式數據加工流水線。


結語:Stream API 通過三階段管道模型,將集合操作轉化為高效聲明式處理。其核心價值在于:
代碼可讀性 ↑ + 并行能力 ↑ + 開發效率 ↑ \text{代碼可讀性} \uparrow + \text{并行能力} \uparrow + \text{開發效率} \uparrow 代碼可讀性+并行能力+開發效率

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

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

相關文章

2025學年湖北省職業院校技能大賽 “信息安全管理與評估”賽項 樣題卷(二)

2025學年湖北省職業院校技能大賽 “信息安全管理與評估”賽項 樣題卷&#xff08;二&#xff09; 第一部分&#xff1a;第二部分&#xff1a;網絡安全事件響應、數字取證調查、應用程序安全任務書任務 1&#xff1a;應急響應&#xff08;可以培訓有答案&#xff09;任務 2&…

AiPy實戰(5):效率革命!5分鐘構建行業分析報告

在當今數字化時代&#xff0c;數據呈指數級增長&#xff0c;行業分析報告對于企業的決策制定愈發關鍵。傳統上&#xff0c;撰寫一份行業分析報告&#xff0c;需要分析師耗費大量時間從各類數據庫、新聞資訊平臺、行業報告中手動收集數據&#xff0c;再進行整理、分析和撰寫&…

docker小白自存-windows系統通過docker安裝n8n-nodes-puppeteer

n8n上直接在社區下載puppeteer節點&#xff0c;使用時會報錯說沒有chromium依賴。 找到了n8n-nodes-puppeteer的github試圖解決 根據他的docker安裝指南執行&#xff0c;運行容器時會報exec /docker-custom-entrypoint.sh: no such file or directory &#xff08;明明文件都有…

腳本shebang的作用與使用方法

#!&#xff08;稱為 shebang 或 hashbang&#xff09;是腳本文件開頭的前兩個字符&#xff0c;用于告訴操作系統應該使用哪個解釋器來執行該腳本。 核心作用&#xff1a; 指定解釋器&#xff1a; 明確告訴系統運行這個腳本時應該調用哪個程序&#xff08;解釋器&#xff09;來…

【大模型學習 | BERT 量化學習 (1)】

BERT 情感分析 一、 數據集加載與模型訓練 from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments from datasets import load_dataset import torch import numpy as np from sklearn.metrics import accuracy_score mode_na…

用低通濾波優化串口或485 通信指示燈電路

常見的通信指示燈電路就是簡單的把LED 連到TXD 和RXD 上&#xff0c;一有動靜就閃一下。問題是&#xff0c;如果波特率很高&#xff0c;一次通信時間很短&#xff0c;相當于占空比很低&#xff0c;LED 閃爍的亮度就很弱&#xff0c;不容易觀察。比如MODBUS 通信&#xff0c;波特…

【純干貨】調整word目錄中的行距以及右對齊頁碼

1.問題展現 目錄生成會遇到一些奇葩現象 所以到了展現技術力的時候了【doge】 2.解決word目錄中的行距問題 選中目錄中的文字-》段落 此時你可能勾選了圖片中的一個以上&#xff0c;把他們都取消了&#xff0c; 由于一個目錄的標題對應一個樣式&#xff0c;第一個也可以取消 …

pandas 優雅處理值類型為list的列的csv讀寫問題

文章目錄 直接存儲join list 變成字符串存儲json.dumps序列化存儲以及json.loads反序列化讀取總結 之所以分析這個問題,是因為讀者在跟第三方數據供應商對接數據的時候,老是會遇到數據加載都會出錯的問題,其中一個原因就是list類型數據沒有正確儲存,于是筆者在這篇文章里面詳細…

一種解決 OpenWrt 安裝 docker 之后局域網的設備之間無法互相訪問通信的方法

文章目錄 一、問題背景二、解決方案&#xff08;方法一&#xff09;修改全局設置的 轉發&#xff08; forward&#xff09; 為 接受&#xff08;ACCEPT&#xff09;&#xff08;方法二&#xff09;設置 net.bridge.bridge-nf-call-iptables0 并將 docker 的容器網絡設置為host …

Leetcode百題斬-貪心

貪心也是一個很有意思的專題&#xff0c;能遇到很多神奇的思路。 但這個專題&#xff0c;leetcode也沒放Hard&#xff0c;果然是怕這種玄學專題上點難度大家罩不住。那就很快了&#xff0c;直接過 763. Partition Labels[Medium] 思路&#xff1a;將字母串分組&#xff0c;相…

基于多徑信道的分集接收技術性能優化與仿真分析

基于多徑信道的分集接收技術性能優化與仿真分析 一、多徑信道建模與仿真 1. 多徑信道建模(MATLAB實現) classdef MultipathChannel < handlepropertiesSampleRate = 1e6; % 采樣率 (Hz)MaxDoppler = 100; % 最大多普勒頻移 (Hz)DelayVector = [0

LeetCode 713.乘積小于K的子數組

給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回子數組內所有元素的乘積嚴格小于 k 的連續子數組的數目。 示例 1&#xff1a; 輸入&#xff1a;nums [10,5,2,6], k 100 輸出&#xff1a;8 解釋&#xff1a;8 個乘積小于 100 的子數組分別為&#xff1a;[10]、[5…

打破網絡安全孤島:實現防御數據協作

作者&#xff1a;來自 Elastic Crossley McEwen, Oksana Abramovych 現代網絡戰場不再受組織邊界的限制。在各類防御網絡中&#xff0c;關鍵的結構化、非結構化和半結構化數據分布在不同的專業環境中&#xff0c;形成孤島 —— 從機密情報系統到作戰指揮平臺&#xff0c;再到戰…

給定一個沒有重復元素的數組,寫出生成這個數組的MaxTree的函數

題目&#xff1a; 給定一個沒有重復元素的數組arr&#xff0c;寫出生成這個數組的MaxTree的 函數&#xff0c;要求如果數組長度為N&#xff0c;則時間復雜度為O(N)、額外空間復雜度 為O(N)。 一個數組的MaxTree定義如下。 ● 數組必須沒有重復元素。 ● MaxTree是一棵二叉…

iOS 抓包實戰:時間戳偏差導致的數據同步異常排查記錄

“這條數據不是我填的”“我的更新被覆蓋了”“兩個設備顯示不一致”——這些是產品上線后最令人頭疼的反饋。 最近我們在一次用戶同步問題排查中&#xff0c;發現表面是“數據丟失”問題&#xff0c;實則是多端數據提交時間戳處理不一致&#xff0c;導致后臺認為老數據為新&a…

一款支持多日志器、多級別、多落地方式的同異步日志系統

文章目錄 簡介項目特點項目實現基礎功能模塊實現文件操作以及日期時間獲取日志等級日志信息描述 異步功能模塊實現緩沖區實現異步線程實現 核心功能模塊實現日志格式解析落地操作實現日志器實現 測試測試環境測試參數測試結果性能分析 附件 簡介 在現代軟件開發與系統運維領域…

加固筆記本在戶外勘探行業的應用:探索與科技的融合

在自然資源勘探、地質調查、石油天然氣開發、礦產資源測繪等戶外勘探行業中&#xff0c;作業環境常常復雜多變&#xff1a;風沙漫天的戈壁、雨雪交加的山區、濕熱潮濕的叢林&#xff0c;甚至是極寒與高溫并存的極端氣候條件。面對這些挑戰&#xff0c;普通的辦公設備早已無法勝…

MySQL 連接指定端口后,為什么實際仍是 3306?

文章目錄 MySQL 連接指定端口后&#xff0c;為什么實際仍是 3306&#xff1f;問題現象復現原因分析沒有指定 -h&#xff0c;默認走的是本地 Unix Socket多實例環境中未顯式指定目標地址 正確的連接方法方法一&#xff1a;添加 -h 127.0.0.1方法二&#xff1a;添加 --protocolTC…

【Android當用戶兩次打斷息屏操作后,屏幕將會在10分鐘內無法熄滅并持續點亮(關閉Android13新增的dim功能)】

UndimDetectorWakeLock持鎖導致屏幕不滅問題處理SOP 問題描述 在Android T版本中&#xff0c;系統新增了SCREEN_BRIGHT_WAKE_LOCK&#xff08;UndimDetectorWakeLock&#xff09;機制。當設備處于低亮度&#xff08;dim&#xff09;狀態時&#xff0c;用戶兩次打斷屏幕熄滅操…

Tailwind CSS自定義用法

文章目錄 前言? 一、集成 Tailwind CSS 到 React 項目1. 安裝依賴2. 配置 tailwind.config.js3. 創建全局樣式文件&#xff08;如 src/index.css&#xff09;tailwind base;tailwind components;tailwind utilities; 4. 在 main.tsx 或 main.jsx 中引入樣式 ? 二、自定義樣式…