Java 8 Stream API 入門到實踐詳解

一、告別 for 循環!

傳統痛點
Java 8 之前,集合操作離不開冗長的 for 循環和匿名類。例如,過濾列表中的偶數:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evens = new ArrayList<>();
for (Integer num : list) {if (num % 2 == 0) evens.add(num);
}

Stream 救場
一行代碼搞定:

List<Integer> evens = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());

核心優勢

  • 簡潔:鏈式調用替代復雜循環。
  • 高效:惰性計算(Lazy Evaluation),按需執行。
  • 并行:一鍵切換并行處理,提升性能。

二、Stream 三大核心操作:過濾、映射、歸約
1. 過濾(filter):篩出想要的元素

作用:只保留符合條件的元素。
語法filter(Predicate<T> predicate)
示例:篩選長度超過3的字符串

List<String> languages = Arrays.asList("Java", "Python", "C++", "Go");
List<String> filtered = languages.stream().filter(s -> s.length() > 3).collect(Collectors.toList());
// 結果: ["Java", "Python"]

底層邏輯:遍歷流中每個元素,保留 predicate.test(element)true 的元素。
注意filter中間操作,返回新流,需配合終端操作(如 collect)才能執行。


2. 映射(map):元素轉換

作用:將元素轉換為另一種形式。
語法map(Function<? super T, ? extends R> mapper)
示例:將字符串轉為大寫

List<String> upperCase = languages.stream().map(String::toUpperCase).collect(Collectors.toList());
// 結果: ["JAVA", "PYTHON", "C++", "GO"]

進階玩法

  • 扁平化嵌套集合:用?flatMap?展開多層結構
     
    List<List<String>> nested = Arrays.asList(Arrays.asList("a", "b"),Arrays.asList("c", "d"));
    List<String> flat = nested.stream().flatMap(Collection::stream).collect(Collectors.toList());
    // 結果: ["a", "b", "c", "d"]
    


3. 歸約(reduce):聚合數值,合二為一

作用:將元素合并為一個值(如求和、拼接字符串)。
語法reduce(T identity, BinaryOperator<T> accumulator)
示例:計算整數列表的總和

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream().reduce(0, Integer::sum);
// 結果: 10

魔法細節

  • identity?是初始值(如求和時設為?0)。
  • accumulator?定義如何合并元素(如?a + b)。

三、實戰:從新手到封神的 3 個場景
場景1:統計文本中單詞頻率
String text = "java stream api is powerful and easy to use";
Map<String, Long> wordCount = Arrays.stream(text.split(" ")).collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// 結果: {java=1, stream=1, api=1, ...}

關鍵點

  • split(" ")?分割字符串為流。
  • groupingBy?按單詞分組,counting?統計次數。

場景2:并行處理大數據(真香警告)
List<Integer> largeList = IntStream.range(0, 1000000).parallel() // 切換并行流.filter(x -> x % 2 == 0).boxed().collect(Collectors.toList());
System.out.println(largeList );

效率對比

  • 串行流處理100萬數據:約500ms。
  • 并行流處理:約100ms(8核CPU)。

場景3:多級排序(薪資+年齡)
class Employee {String name;int salary;int age;// constructor & getters
}List<Employee> sorted = employees.stream().sorted(Comparator.comparing(Employee::getSalary).thenComparing(Employee::getAge)).collect(Collectors.toList());
System.out.println(sorted);

技巧:鏈式 Comparator 實現多條件排序。


四、避坑指南:新手常踩的雷區
  1. 流只能使用一次

    Stream<Integer> stream = numbers.stream();
    stream.forEach(System.out::println); // 正常
    stream.forEach(System.out::println); // 報錯!流已關閉
    
  2. 避免修改外部變量
    
    int count = 0;
    numbers.stream().forEach(n -> count++); // 錯誤!并行流下可能出錯
    
  3. 并行流未必更快

    • 小數據量:串行更優(省去線程切換開銷)。
    • 大數據量+復雜操作:并行提速顯著。

五、總結:Stream API 的江湖地位
操作傳統方式Stream 寫法爽點
過濾偶數for?+?iffilter(x -> x%2==0)代碼量減半
字符串轉大寫循環+toUpperCasemap(String::toUpperCase)一行搞定
統計總數for?累加reduce(0, Integer::sum)函數式編程優雅度拉滿

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

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

相關文章

黃柏基因組-小檗堿生物合成的趨同進化-文獻精讀142

Convergent evolution of berberine biosynthesis 小檗堿生物合成的趨同進化 摘要 小檗堿是一種有效的抗菌和抗糖尿病生物堿&#xff0c;主要從不同植物譜系中提取&#xff0c;特別是從小檗屬&#xff08;毛茛目&#xff0c;早期分支的真雙子葉植物&#xff09;和黃柏屬&…

機器學習14-遷移學習

遷移學習學習筆記 一、遷移學習概述 遷移學習是機器學習中的一個重要領域&#xff0c;它旨在解決當目標任務的訓練數據有限時&#xff0c;如何利用與目標任務相關但不完全相同的源任務數據來提高學習性能的問題。在現實世界中&#xff0c;獲取大量高質量的標注數據往往成本高…

013旅游網站設計技術詳解:打造一站式旅游服務平臺

旅游網站設計技術詳解&#xff1a;打造一站式旅游服務平臺 在互聯網與旅游業深度融合的時代&#xff0c;旅游網站成為人們規劃行程、預訂服務的重要工具。一個功能完備的旅游網站&#xff0c;通過用戶管理、訂單管理等核心模塊&#xff0c;實現用戶與管理員的高效交互。本文將…

量子計算+AI:特征選擇與神經網絡優化創新應用

在由玻色量子協辦的第二屆APMCM“五岳杯”量子計算挑戰賽中&#xff0c;來自北京理工大學的Q-Masterminds團隊摘取了銀獎。該團隊由北京理工大學張玉利教授指導&#xff0c;依托玻色量子550計算量子比特的相干光量子計算機&#xff0c;將量子計算技術集成到特征選擇和神經網絡剪…

Maven相關問題:jna版本與ES沖突 + aop失效

文章目錄 1、背景2、解決3、一點思考4、環境升級導致AOP失效5、okhttp Bean找不到6、總結 記錄一些Maven依賴相關的思考 1、背景 做一個監控指標收集&#xff0c;用一下jna依賴&#xff1a; <dependency><groupId>net.java.dev.jna</groupId><artifact…

gitlab CI/CD本地部署配置

背景: 代碼管理平臺切換為公司本地服務器的gitlab server。為了保證commit的代碼至少編譯ok&#xff0c;也為了以后能拓展test cases&#xff0c;現在先搭建本地gitlab server的CI/CD基本的編譯job pipeline。 配置步驟&#xff1a; 先安裝gitlab-runner: curl -L "ht…

移除元素-JavaScript【算法學習day.04】

題目鏈接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 第一種思路 標簽&#xff1a;拷貝覆蓋 主要思路是遍歷數組 nums&#xff0c;每次取出的數字變量為 num&#xff0c;同時設置一個下標 ans 在遍歷過程中如果出現數字與需要移除的值不相同時&#xff…

leetcode sql50題

在中文站沒找到對應的集合&#xff0c;想來自己動手拷貝過來&#xff0c;方便大家面試復習用&#xff0c;對應英文站點&#xff1a; https://leetcode.com/studyplan/top-sql-50/ Select #1757. 可回收且低脂的產品 鏈接: https://leetcode.cn/problems/recyclable-and-low-fa…

Dynadot專業版郵箱工具指南(五):將域名郵箱添加至Outlook客戶端

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

【RTSP從零實踐】1、根據RTSP協議實現一個RTSP服務

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

Python網頁數據抓取常用的庫及方法介紹

Python網頁數據抓取常用的庫及方法介紹 摘要:以下是Python網絡數據抓取常用的6個庫的詳細介紹,包括它們的概述以及每個庫中最常用的10個函數(如果某些庫常用函數不足10個,則列出所有常用函數)。每個函數都附帶功能描述、用法說明和使用示例。這些庫在網絡爬蟲、數據…

6.5 note

一個很有意思的dfs模擬題_前序遍歷 這個問題的話前置內容顯然是字典序&#xff0c;什么是字典序呢&#xff1f; 顧名思義&#xff0c;就是詞語在字典中的順序&#xff0c;也就是我們最常說的a,abandon,ability&#xff08;我記得前三個是這個&#xff09; 這是一種字符串之間比…

day027-Shell自動化編程-基礎

文章目錄 1. 修改vim配置文件自動添加注釋2. 故障案例&#xff1a;Windows上寫的Shell腳本上傳到Linux系統上運行報錯3. 腳本運行方法4. 變量4.1 普通變量4.2 環境變量4.3 特殊變量4.4 案例&#xff1a;書寫ping檢查腳本&#xff0c;檢查腳本傳入的第一個參數4.5 面試題&#x…

2025年滲透測試面試題總結-騰訊[實習]科恩實驗室-安全工程師(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 騰訊[實習]科恩實驗室-安全工程師 一、網絡與協議 1. TCP三次握手 2. SYN掃描原理 3. HTTPS證書機制 二…

人工智能賦能高中學科教學的應用與前景研究

一、引言 1.1 研究背景 在科技飛速發展的當下&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;簡稱 AI&#xff09;已成為全球矚目的關鍵技術領域&#xff0c;深刻地改變著人們的生活、工作和學習方式。從智能家居設備到智能交通系統&#xff0c;從醫療…

八、【ESP32開發全棧指南:UDP客戶端】

1. 環境準備 安裝ESP-IDF v4.4 (官方指南)確保Python 3.7 和Git已安裝 2. 創建項目 idf.py create-project udp_client cd udp_client3. 完整優化代碼 (main/main.c) #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h&…

Android Studio 解決首次安裝時下載 Gradle 慢問題

1、問題描述 第一次安裝 Android Studio 時&#xff0c; 新建工程后&#xff0c;在編譯時會自動去下載 Gradle&#xff0c;但是一般都會下載失敗&#xff0c;提示鏈接超時&#xff1a; Could not install Gradle distribution from https://services.gradle.org/distributions…

hive聚合函數多行合并

在數據倉庫和大數據處理的場景中&#xff0c;Hive提供了強大的SQL查詢能力&#xff0c;其中包括聚合函數用于處理和合并多行數據。本文將深入探討Hive中的幾種常見聚合函數及其在多行合并中的應用。 一、Hive中的常見聚合函數 Hive提供了多種聚合函數&#xff0c;這些函數可以…

關于物聯網的基礎知識(一)

成長路上不孤單&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///計算機愛好者&#x1f60a;///持續分享所學&#x1f60a;///如有需要歡迎收藏轉發///&#x1f60a;】 今日分享關于物聯網的基礎知識&#xff08;一&a…

遷移科技3D視覺系統:重塑紙箱拆垛場景的智能革命

一、傳統拆垛場景的困局與破局之道 在汽車零部件倉庫中&#xff0c;每天有超過2萬只異形紙箱需要拆垛分揀。傳統人工拆垛面臨三大挑戰&#xff1a; 效率瓶頸&#xff1a;工人每小時僅能處理200-300件&#xff0c;且存在間歇性疲勞安全隱患&#xff1a;20kg以上重箱搬運導致年…