java的Stream流處理

Java Stream 流處理詳解

Stream 是 Java 8 引入的一個強大的數據處理抽象,它允許你以聲明式方式處理數據集合(類似于 SQL 語句),支持并行操作,提高了代碼的可讀性和處理效率。

一、Stream 的核心概念

1. 什么是 Stream

  • 不是數據結構:不存儲數據,只是從數據源(集合、數組等)獲取數據

  • 函數式風格:支持 lambda 表達式和方法引用

  • 延遲執行:許多操作(中間操作)不會立即執行,只有遇到終止操作才會執行

  • 可消費性:Stream 只能被消費一次,用完即失效

2. 操作類型

  • 中間操作(Intermediate Operations):返回 Stream 本身,可以鏈式調用(如 filter, map)

  • 終止操作(Terminal Operations):產生最終結果或副作用(如 forEach, collect)

二、創建 Stream 的多種方式

// 1. 從集合創建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream1 = list.stream();       // 順序流
Stream<String> parallelStream = list.parallelStream(); // 并行流// 2. 從數組創建
String[] array = {"a", "b", "c"};
Stream<String> stream2 = Arrays.stream(array);// 3. 使用Stream.of()
Stream<String> stream3 = Stream.of("a", "b", "c");// 4. 使用Stream.generate() 無限流
Stream<Double> randomStream = Stream.generate(Math::random).limit(5);// 5. 使用Stream.iterate() 迭代流
Stream<Integer> iterateStream = Stream.iterate(0, n -> n + 2).limit(10);

三、常用的中間操作

1. 過濾操作

// filter(Predicate) 過濾符合條件的元素
List<String> filtered = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());

2. 映射操作

// map(Function) 將元素轉換為其他形式
List<Integer> lengths = list.stream().map(String::length).collect(Collectors.toList());// flatMap 將多個流合并為一個流
List<String> flatMapped = list.stream().flatMap(s -> Stream.of(s.split(""))).collect(Collectors.toList());

3. 去重和排序

// distinct() 去重
List<String> distinct = list.stream().distinct().collect(Collectors.toList());// sorted() 自然排序
List<String> sorted = list.stream().sorted().collect(Collectors.toList());// sorted(Comparator) 自定義排序
List<String> customSorted = list.stream().sorted((s1, s2) -> s2.compareTo(s1)).collect(Collectors.toList());

4. 其他中間操作

// limit(long) 限制元素數量
// skip(long) 跳過前N個元素
// peek(Consumer) 查看流中元素(主要用于調試)

四、常用的終止操作

1. 遍歷操作

// forEach(Consumer) 遍歷每個元素
list.stream().forEach(System.out::println);

2. 收集結果

// collect(Collector) 將流轉換為集合或其他形式
List<String> collectedList = stream.collect(Collectors.toList());
Set<String> collectedSet = stream.collect(Collectors.toSet());
Map<String, Integer> map = stream.collect(Collectors.toMap(Function.identity(), String::length));

3. 聚合操作

// count() 計數
long count = list.stream().count();// max/min(Comparator) 最大/最小值
Optional<String> max = list.stream().max(Comparator.naturalOrder());// reduce 歸約操作
Optional<Integer> sum = Stream.of(1, 2, 3).reduce(Integer::sum);

4. 匹配操作

// anyMatch 任意元素匹配
boolean anyStartsWithA = list.stream().anyMatch(s -> s.startsWith("a"));// allMatch 所有元素匹配
boolean allStartsWithA = list.stream().allMatch(s -> s.startsWith("a"));// noneMatch 沒有元素匹配
boolean noneStartsWithZ = list.stream().noneMatch(s -> s.startsWith("z"));

五、數值流特化

Java 8 提供了專門的數值流,避免裝箱拆箱開銷:

// IntStream, LongStream, DoubleStream
IntStream intStream = IntStream.range(1, 100); // 1-99
DoubleStream doubleStream = DoubleStream.of(1.1, 2.2);// 常用數值操作
int sum = IntStream.rangeClosed(1, 100).sum(); // 1-100的和
OptionalDouble avg = IntStream.of(1, 2, 3).average();

六、并行流處理

// 創建并行流
List<String> parallelProcessed = list.parallelStream().filter(s -> s.length() > 1).collect(Collectors.toList());// 注意事項:
// 1. 確保操作是線程安全的
// 2. 避免有狀態的操作
// 3. 數據量足夠大時才使用并行流

七、收集器(Collectors)的高級用法

// 分組
Map<Integer, List<String>> groupByLength = list.stream().collect(Collectors.groupingBy(String::length));// 分區
Map<Boolean, List<String>> partition = list.stream().collect(Collectors.partitioningBy(s -> s.startsWith("a")));// 連接字符串
String joined = list.stream().collect(Collectors.joining(", "));// 匯總統計
IntSummaryStatistics stats = list.stream().collect(Collectors.summarizingInt(String::length));

八、實際應用示例

示例1:處理對象集合

List<Person> people = ...;// 獲取所有成年人的姓名列表
List<String> adultNames = people.stream().filter(p -> p.getAge() >= 18).map(Person::getName).collect(Collectors.toList());// 按城市分組
Map<String, List<Person>> byCity = people.stream().collect(Collectors.groupingBy(Person::getCity));// 計算每個城市的平均年齡
Map<String, Double> avgAgeByCity = people.stream().collect(Collectors.groupingBy(Person::getCity,Collectors.averagingInt(Person::getAge)));

示例2:文件處理

// 讀取文件并處理
try (Stream<String> lines = Files.lines(Paths.get("data.txt"))) {long wordCount = lines.flatMap(line -> Arrays.stream(line.split("\\s+"))).filter(word -> word.length() > 0).count();
} catch (IOException e) {e.printStackTrace();
}

九、注意事項

  1. 流只能消費一次:嘗試第二次使用已關閉的流會拋出?IllegalStateException

  2. 避免修改源數據:流操作期間不應修改源集合

  3. 合理使用并行流:并非所有情況都適合并行,小數據量可能適得其反

  4. 注意自動裝箱:數值操作盡量使用原始類型特化流(IntStream等)

  5. 延遲執行特性:沒有終止操作,中間操作不會執行

Stream API 提供了一種高效、聲明式的數據處理方式,是現代 Java 編程中不可或缺的工具。合理使用可以大幅提升代碼的可讀性和維護性。

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

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

相關文章

llama-Factory不宜直接掛接Ollama的大模型

前言 llama-Factory嘗試使用Ollama本地安裝的大模型。 一、在Ollama中安裝QWen 安裝qwen:0.5b 安裝完成了&#xff1a; 同理安裝qwen2.5:0.5b 安裝完畢后&#xff0c;再用ollama list進行查看&#xff1a; 我們在chatbox中進行查看&#xff1a; 說明這兩個大模型&#xff0c;…

基于WSL用MSVC編譯ffmpeg7.1

在windows平臺編譯FFmpeg&#xff0c;網上的大部分資料都是推薦用msys2mingw進行編譯。在win10平臺&#xff0c;我們可以采用另一種方式&#xff0c;即wslmsvc 實現window平臺的ffmpeg編譯。 下面將以vs2022ubuntu22.04 為例&#xff0c;介紹此方法 0、前期準備 安裝vs2022 &…

vue3+vite項目引入tailwindcss

從2025年1月tailwindcss4.0發布開始使用tailwindcss比之前簡化很多 1,安裝 yarn add tailwindcss tailwindcss/vite2,配置vite.config.js import tailwindcss from tailwindcss/vite;...plugins: [tailwindcss(),...] ...3,在主css文件頂部添加 注意一定是css文件,不能是sc…

藍牙RFCOMM協議概述

RFCOMM概述 概念 RFCOMM 協議提供了對 L2CAP 協議上的串行端口的模擬。該協議基于 ETSI 標準 GSM 07.10。 RFCOMM 采用與 TS07.10 相同的字節序列方式。所有二進制數字都按照從低位到高位的順序&#xff0c;從左至右讀。 兩個使用RFCOMM通信的藍牙設備可以打開多個仿真串行端…

[工具]B站緩存工具箱 (By 郭逍遙)

&#x1f4cc; 項目簡介 B站緩存工具箱是一個多功能的B站緩存工具&#xff0c;包含視頻下載、緩存重載、文件合并及系統設置四大核心功能。基于yutto開發&#xff0c;采用圖形化界面操作&#xff0c;極大簡化B站資源獲取與管理流程。 工具可以直接將原本緩存的視頻讀取&#…

算法訓練營第十三天|226.翻轉二叉樹、101. 對稱二叉樹、 104.二叉樹的最大深度、111.二叉樹的最小深度

遞歸 遞歸三部曲&#xff1a; 1.確定參數和返回值2.確定終止條件3.確定單層邏輯 226.翻轉二叉樹 題目 思路與解法 第一想法&#xff1a; 遞歸&#xff0c;對每個結點進行反轉 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, le…

sunset:Solstice靶場

sunset:Solstice https://www.vulnhub.com/entry/sunset-solstice,499/ 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.182&#xff0c;靶場IP192.168.23.244 3&#xff…

AZScreenRecorder最新版:功能強大、操作簡便的手機錄屏軟件

AZScreenRecorder最新版是一款功能強大的手機錄屏軟件&#xff0c;專為安卓設備設計。它無需ROOT權限&#xff0c;支持無限錄制時長&#xff0c;操作簡單&#xff0c;錄制過程中可以隨時暫停&#xff0c;滿足不同用戶的個性化錄屏需求。此外&#xff0c;用戶還可以自定義分辨率…

模塊自動導入的小工具

import { ref, reactive, onMounted } from vue import { useRoute, useRouter } from vue-router項目里很多文件都需要引入這些公共庫&#xff0c;比較繁瑣&#xff0c;使用一個小工具可以自動導入&#xff0c;就不需要在每個文件里面都寫這些導入的代碼了。 通過命令行下載安…

【讀書筆記】《編碼:隱匿在計算機軟硬件背后的語言》01 邏輯與開關

【讀書筆記】《編碼&#xff1a;隱匿在計算機軟硬件背后的語言》01 邏輯與開關 前言01 邏輯與開關 前言 我是一名光學工程專業研二的學生&#xff0c;目前正處于找工作的階段&#xff0c;根據往年師兄師姐找工作的情況&#xff0c;在西安這個城市不出意外我能找到的應該就是嵌入…

TXT編碼轉換工具iconv

iconv.exe是實現TXT編碼轉換的命令行工具&#xff0c;支持幾百種編碼格式的轉換&#xff0c;利用它可以在自主開發程序上實現TXT文檔編碼的自動轉換。 一、命令參數格式 Usage: iconv [-c] [-s] [-f fromcode] [-t tocode] [file ...] or: iconv -l 二、轉換的示例 將UTF-8…

軟考中級數據庫備考-上午篇

背景 新工作主要做大數據平臺&#xff0c;考一個軟考中級數據庫系統工程師&#xff0c;補足一下基礎知識。 基礎知識 1.計算機硬件基礎知識 正確答案:C 正確答案:D 正確答案:C 正確答案&#xff1a;BC 正確答案&#xff1a;B 正確答案:D 正確答案:A DMA建立內存與外設的直接…

AtCoder AT_abc405_d ABC405D - Escape Route

前言 BFS 算法在 AtCoder 比賽中還是會考的&#xff0c;因為不常練習導致沒想到&#xff0c;不僅錯誤 TLE 了很多&#xff0c;還影響了心態&#xff0c;3 發罰時后才 AC。 思路 首先&#xff0c;我們把所有位置和出口的距離算出來&#xff08;用 BFS&#xff09;&#xff0c…

【計算機視覺】目標檢測:yoloV1~yoloV11項目論文及對比

以下是 YOLO (You Only Look Once) 系列模型從 V1 到 V11 的詳細介紹和項目地址&#xff08;截至2024年7月&#xff09;。YOLO 是目標檢測領域的里程碑模型&#xff0c;以其 實時性 和 高精度 著稱&#xff0c;廣泛應用于自動駕駛、安防監控、工業檢測等領域。 YOLOv1 (2016) …

推薦系統架構設計

1.分析用戶行為數據?&#xff1a;? 收集用戶的活躍時間、點擊行為、瀏覽歷史等數據。?分析用戶的活躍模式&#xff0c;確定用戶最活躍的時間段。?kafka flink 數據庫 分析用戶行為并存儲 2. 預生成推薦內容?&#xff1a;? 在用戶活躍時間之前&#xff0c;預先生成推薦…

BERT類模型

1. BERT類模型是否需要處理 [CLS] 或池化&#xff1f; 那首先搞懂 [CLS] 和池化 &#xff08;1&#xff09;[CLS] 的作用 BERT 的輸入格式中&#xff0c;每個序列的開頭會添加一個特殊的 [CLS] Token&#xff08;Classification Token&#xff09;。它的設計初衷是為分類任務…

我的世界云端服務器具體是指什么?

我的世界云端服務器是指一種基于互聯網的多人游戲服務器&#xff0c;將游戲服務器運行在云平臺上&#xff0c;而不是在本地計算機中&#xff0c;這使用戶不需要考慮自身電腦的性能和網絡穩定性&#xff0c;只需要通過網絡連接到云端服務器&#xff0c;就可以享受到順暢的游戲體…

軟考(信息系統運行管理員)

第一章 信息系統運維概述 1.1 信息系統概述 信息的含義和類型 信息的含義&#xff1a; 一般&#xff1a;人們關心的事情的消息或知識。香農&#xff08;信息論創始人&#xff09;&#xff1a;用來減少隨機不確定性的東西&#xff08;標志著信息科學進入定量研究階段&#xff…

Unity基礎學習(九)輸入系統全解析:鼠標、鍵盤與軸控制

目錄 一、Input類 1. 鼠標輸入 2. 鍵盤輸入 3. 默認軸輸入 &#xff08;1&#xff09; 基礎參數 &#xff08;2&#xff09;按鍵綁定參數 &#xff08;3&#xff09;輸入響應參數 &#xff08;4&#xff09;輸入類型與設備參數 &#xff08;5&#xff09;不同類型軸的參…

VBA將PDF文檔內容逐行寫入Excel

VBA是無法直接讀取PDF文檔的&#xff0c;但結合上期我給大家介紹了PDF轉換工具xpdf-tools-4.05&#xff0c;先利用它將PDF文檔轉換為TXT文檔&#xff0c;然后再將TXT的內容寫入Excel&#xff0c;這樣就間接實現了將PDF文檔的內容導入Excel的操作。下面的代碼將向大家演示如何實…