Java 8 的流(Stream API)簡介

Java 8 引入的 Stream API 是一個強大的工具,用于處理集合(如 List、Set)中的元素。它支持各種操作,包括過濾、排序、映射等,并且能夠以聲明式的方式表達復雜的查詢操作。流操作可以是中間操作(返回流以便進一步處理)或終端操作(產生結果或副作用)。此外,Stream API 還支持并行執行,從而利用多核處理器的優勢。

Stream 的基本概念


  • 任何提供數據的集合(如?ListSet、數組等)均可作為流的來源。

  • 中間操作
    返回新流對象,支持鏈式調用,惰性求值。常見操作包括:

    • filter(篩選)
    • map(映射)
    • sorted(排序)
    • distinct(去重)
    • limit(限制數量)
    • skip(跳過元素)
    • flatMap(扁平化映射)
    • peek(調試查看)
  • 終端操作
    觸發流處理并生成結果,執行后流被消耗。常見操作包括:

    • forEach(遍歷)
    • collect(收集到集合)
    • reduce(聚合)
    • count(統計數量)
    • findFirst/findAny(查找元素)
    • anyMatch/allMatch/noneMatch(匹配驗證)

創建 Stream 的方式

  1. 從集合創建

    List<String> list = Arrays.asList("apple", "banana", "pear");
    Stream<String> stream = list.stream();
  2. 從數組創建

    String[] arr = {"apple", "banana", "pear"};
    Stream<String> stream = Arrays.stream(arr);
  3. 生成無限流

    // 迭代生成(0, 1, 2, ...)
    Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 1);// 隨機生成
    Stream<Double> randomStream = Stream.generate(Math::random);

中間操作詳解

1. 篩選與切片

  • filter:按條件篩選元素

    List<String> filtered = list.stream().filter(s -> s.length() > 3).collect(Collectors.toList());
  • distinct:去重(需重寫?equals?和?hashCode

    List<Integer> distinctList = Arrays.asList(1, 2, 2, 3).stream().distinct().collect(Collectors.toList()); // [1, 2, 3]
  • limit:截取前 N 個元素

    List<String> firstTwo = list.stream().limit(2).collect(Collectors.toList());
  • skip:跳過前 N 個元素

    List<String> skipped = list.stream().skip(1).collect(Collectors.toList());

2. 映射與扁平化

  • map:元素類型轉換

    List<String> upperCase = list.stream().map(String::toUpperCase).collect(Collectors.toList());
  • flatMap:扁平化嵌套集合

    List<List<Integer>> nestedList = Arrays.asList(Arrays.asList(1, 2),Arrays.asList(3, 4)
    );
    List<Integer> flatList = nestedList.stream().flatMap(List::stream).collect(Collectors.toList()); // [1, 2, 3, 4]

3. 排序

  • 自然排序

    List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
  • 自定義排序

    List<Employee> sortedEmployees = employees.stream().sorted((e1, e2) -> e2.getAge() - e1.getAge()).collect(Collectors.toList());

4. 調試查看

  • peek:遍歷元素時執行操作(如打印)
    list.stream().peek(System.out::println).collect(Collectors.toList());

終端操作詳解

1. 收集結果

  • 收集到集合

    List<String> listResult = Stream.of("a", "b", "c").collect(Collectors.toList());Set<String> setResult = Stream.of("apple", "banana", "pear").collect(Collectors.toSet());
  • 分組與分區

    Map<Integer, List<String>> grouped = list.stream().collect(Collectors.groupingBy(s -> s.length()));

2. 聚合操作

  • reduce?求和

    int sum = numbers.stream().reduce(0, (a, b) -> a + b);
  • 拼接字符串

    String joined = Stream.of("a", "b", "c").reduce("", (a, b) -> a + b); // "abc"
  • 無初始值的聚合

    Optional<Integer> max = numbers.stream().reduce(Integer::max);

3. 查找與匹配

  • findFirst:獲取第一個元素

    Optional<String> first = list.stream().filter(s -> s.startsWith("a")).findFirst();
  • findAny:獲取任意元素(并行流中可能亂序)

    Optional<String> any = list.parallelStream().findAny();
  • max/min:獲取極值

    Optional<Integer> maxNumber = numbers.stream().max(Integer::compare);

4. 匹配驗證

  • anyMatch:至少一個元素滿足條件

    boolean hasEven = numbers.stream().anyMatch(n -> n % 2 == 0);
  • allMatch:所有元素滿足條件

    boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0);
  • noneMatch:無元素滿足條件

    boolean noEven = numbers.stream().noneMatch(n -> n % 2 == 0);

5. 統計與轉換

  • count:統計元素數量

    long count = list.stream().filter(s -> s.length() > 3).count();
  • toArray:轉換為數組

    String[] array = list.stream().toArray(String[]::new);
  • 數值統計

    IntSummaryStatistics stats = numbers.stream().mapToInt(Integer::intValue).summaryStatistics();
    System.out.println(stats.getAverage()); // 平均值

6. 遍歷操作

  • forEach:執行副作用操作
    list.stream().forEach(System.out::println);

并行流(Parallel Stream)

  • 啟用并行流

    List<String> list = Arrays.asList("apple", "banana", "pear");
    list.parallelStream().forEach(System.out::println);
  • 注意事項

    • 并行流可能提高大數據集處理性能。
    • 需確保線程安全性(如避免共享狀態修改)。
    • 并行排序(sorted())可能不穩定,需謹慎使用。

注意事項

  1. 中間操作順序
    邏輯順序需合理(如先?filter?再?map)。

  2. 對象去重
    使用?distinct()?時需重寫?hashCode()?和?equals()

  3. 流復用問題
    終端操作后流被消耗,需重新創建流:

    Stream<String> stream = list.stream();
    stream.forEach(System.out::println); // 首次使用
    stream.forEach(System.out::println); // 報錯!流已關閉
  4. 安全獲取值
    使用?Optional?的?orElse()orElseGet()?或?orElseThrow()?避免空指針。

總結

Java 8 Stream API 通過聲明式編程簡化了集合操作,支持鏈式調用和并行處理。合理使用中間操作(如?filtermap)和終端操作(如?collectreduce),可高效完成數據聚合、過濾及驗證。結合并行流可顯著提升大數據集處理性能,但需注意線程安全性和操作順序。

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

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

相關文章

4. Flink SQL訪問HiveCatalog

一. 實驗環境 Flink版本: 1.19.1 Hive版本: 2.1.3 Hadoop版本: 3.2.4二. 操作步驟 1.上傳所需的jar包到Flink lib目錄下 [roothadoop3 ~]# mv flink-sql-connector-hive-3.1.3_2.12-1.19.1.jar /www/flink-1.19.1/lib [roothadoop3 ~]# mv hadoop-mapreduce-client-core-3.2…

虛擬試衣間-云尚衣櫥小程序-衣櫥管理實現

衣櫥管理實現 目標 (Goal): 用戶 (User): 能通過 UniApp 小程序上傳衣服圖片。 后端 (Backend): 接收圖片,存到云存儲,并將圖片信息(URL、用戶ID等)存入數據庫。 用戶 (User): 能在小程序里看到自己上傳的所有衣服圖片列表。 技術棧細化 (Refined Tech Stack for this Pha…

HAL庫 通過USB Boot進行APP程序升級

硬件&#xff1a;stm32f407VET6芯片&#xff1b; 軟件&#xff1a;STM32CubeMx、Keil5 上位機&#xff1a;Dfuse DemoV3.06 這里給出通過在Bootlaoder中使用USB方式來更新APP程序的方法&#xff0c;首先我們編寫一個自己的bootloader&#xff0c;關于bootloader的大致原理可以…

數據庫權限獲取

1. into outfile&#xff08;手寫&#xff09; 1.1. 利用條件 ? web 目錄具有寫入權限&#xff0c;能夠使用單引號 ? 知道網站絕對路徑&#xff08;根目錄&#xff0c;或則是根目錄往下的目錄都行&#xff09; ? secure_file_priv 沒有具體值&#xff08;在 mysql/my.ini…

關于ESP系列MCU的UART download原理

GPIO0&#xff0c;即BOOT&#xff0c;工作模式選擇&#xff1a; 懸空/拉高&#xff1a;正常MCU啟動工作狀態 下拉接地&#xff1a;UARTDownload下載模式 如何進入UARTDownload下載模式&#xff1f; 先按下boot按鍵不放&#xff0c;再按下rst按鍵 / en按鍵&#xff0c;隨后釋放…

無需安裝Office進行 Word、Excel操作的微軟開發庫

微軟的確有一些無需安裝完整 Office 就能進行 Word、Excel 操作的開發庫&#xff0c;以下為你介紹&#xff1a; 1. Microsoft Graph API 簡介&#xff1a;Microsoft Graph API 是一個強大的 RESTful API&#xff0c;能讓開發者通過調用接口訪問 Office 365 服務里的各種資源&…

【一起來學kubernetes】34、ReplicaSet使用詳解

Kubernetes ReplicaSet 使用詳解 ReplicaSet 是 Kubernetes 中用于確保指定數量的 Pod 副本持續運行的核心控制器。它通過動態調整 Pod 副本數&#xff0c;保障應用的高可用性和彈性。以下是其核心功能、配置方法及最佳實踐&#xff1a; 一、ReplicaSet 核心作用 維持 Pod 副本…

【力扣hot100題】(034)LRU緩存

做完這題已經沒有任何力氣寫鏈表題了。 思路很簡單&#xff0c;就是調試特別的痛苦。 老是頻頻報錯&#xff0c;唉。 class LRUCache { public:struct ListNode{int key,val;ListNode* next; ListNode* prev;ListNode() : key(0), val(0), next(nullptr), prev(nullptr) {}L…

基于隨機森林算法的信用風險評估項目

引言 這是一個基于隨機森林算法的德國信用風險評估項目&#xff0c;主要目的是構建一個機器學習模型來評估德國客戶的信用風險&#xff0c;判斷客戶是否為高風險客戶。 # -*- coding: utf-8 -*- """ 德國信用風險評估隨機森林模型 """ # 基礎…

亞馬遜云科技攜手 DeepSeek:開啟企業級生成式 AI 新征程

文章目錄 一、DeepSeek-R1模型的技術突破&#xff08;一&#xff09;卓越的性能表現&#xff08;二&#xff09;獨特的訓練方法&#xff08;三&#xff09;豐富的模型生態 二、亞馬遜云科技平臺上的部署與優化&#xff08;一&#xff09;靈活的部署方式&#xff08;二&#xff…

Windows 實戰-evtx 文件分析--筆記

Windows 取證之EVTX日志 - 蟻景網安實驗室 - 博客園 一.evtx日志文件是什么 從 Windows NT 6.0&#xff08;也就是 Windows Vista 和 Windows Server 2008&#xff09;開始&#xff0c;微軟引入了一種全新的日志文件格式&#xff0c;稱為 evtx。這種格式取代了之前 Windows 系…

LangChain/Eliza框架在使用場景上的異同,Eliza通過配置實現功能擴展的例子

LangChain與Eliza框架的異同分析 ?一、相同點? ?模塊化架構設計? 兩者均采用模塊化設計&#xff0c;支持靈活擴展和功能組合。LangChain通過Chains、Agents等組件實現多步驟任務編排?&#xff0c;Eliza通過插件系統和信任引擎實現智能體功能的動態擴展?。模塊化特性降低…

英語口語 -- 常用 1368 詞匯

英語口語 -- 常用 1368 詞匯 介紹常用單詞List1 &#xff08;96 個&#xff09;時間類氣候類自然類植物類動物類昆蟲類其他生物地點類 List2 &#xff08;95 個&#xff09;機構類聲音類食品類餐飲類蔬菜類水果類食材類飲料類營養類疾病類房屋類家具類服裝類首飾類化妝品類 Lis…

深挖 DeepSeek 隱藏玩法·智能煉金術2.0版本

前引&#xff1a;屏幕前的你還在AI智能搜索框這樣搜索嗎&#xff1f;“這道題怎么寫”“蘋果為什么紅”“怎么不被發現翹課” &#xff0c;。看到此篇文章的小伙伴們&#xff01;請準備好你的思維魔杖&#xff0c;開啟【霍格沃茨模式】&#xff0c;看我如何更新秘密的【知識煉金…

2025 年浙江危化品經營單位考試攻略分享?

浙江的考試由省應急管理部門主導。理論考試突出危化品在電商、物流等新興業態下的安全管理知識&#xff0c;這與浙江發達的電商產業緊密相關。對危險化學品的環境危害及防治知識考查細致。實際操作考核模擬杭州、寧波等地危化品倉儲物流中心的作業情況。? 報名材料準備齊全后…

【區塊鏈+ 房產建筑】山東省建筑產業互聯網平臺 | FISCO BCOS 應用案例

山東省建筑產業互聯網平臺&#xff08;山東省弘商易盟平臺&#xff09;是基于區塊鏈技術構建的分布式產業互聯網平臺&#xff0c; 旨在把各企業內部的供應鏈協同管理系統&#xff08;包括采購或者SRM 系統&#xff0c; 以及銷售或CRM 系統&#xff09;利用區塊鏈技術鏈接起來&a…

Bash 花括號擴展 {start..end} 進階使用指南——字典生成

Bash 的花括號擴展&#xff08;brace expansion&#xff09;{start..end} 是一個強大而靈活的語法特性&#xff0c;用于生成特定序列或組合。它在腳本編寫、爆破字典生成、文件批量操作以及模式匹配中有著廣泛的應用。本文將從基礎用法到高級技巧&#xff0c;帶你全面掌握這一功…

23種設計模式-結構型模式-享元

文章目錄 簡介問題解決方案享元與不可變性享元工廠 代碼總結 簡介 亦稱&#xff1a;緩存、Cache、Flyweight。享元是一種結構型設計模式&#xff0c;它摒棄了在每個對象中保存所有數據的方式&#xff0c;通過共享多個對象所共有的相同狀態&#xff0c;讓你能在有限的內存容量中…

MFC BCGControlBar

BCGControlBar&#xff08;也稱為 BCGSoft 或 BCGControlBar Library&#xff09;是一個用于 MFC&#xff08;Microsoft Foundation Classes&#xff09; 的擴展庫&#xff0c;主要提供現代化的 UI 控件、Ribbon 界面、工具欄、屬性網格等組件&#xff0c;幫助開發者快速構建專…

【算法手記9】OR26 最長回文子串 NC369 [NOIP2002 普及組] 過河卒

&#x1f984;個人主頁:修修修也 &#x1f38f;所屬專欄:刷題 ??操作環境:牛客網 一.OR26 最長回文子串 牛客網題目鏈接(點擊即可跳轉):OR26 最長回文子串 題目詳情: 本題詳情如下圖: 題目思路: 本題解題思路如下: 本題思路用中心擴展算法,遍歷所有字符,將每個字符作為回文串…