Stream API

Java 8 引入的 Stream API 是處理集合數據的強大工具,它允許你以聲明式方式處理數據集合,支持各種聚合操作和并行處理。以下是 Stream API 的核心知識點及具體代碼示例:

1. Stream 概述

Stream 是數據渠道,用于操作數據源(如集合、數組)所生成的元素序列。注意

  • Stream 自己不會存儲元素。
  • Stream 不會改變源對象,相反,它們會返回一個持有結果的新 Stream。
  • Stream 操作是延遲執行的,這意味著它們會等到需要結果時才執行。

2. Stream 的創建

可以通過集合、數組、靜態方法等創建 Stream。

import java.util.*;
import java.util.stream.*;public class StreamCreation {public static void main(String[] args) {// 1. 通過 Collection 接口的 stream() 或 parallelStream() 方法List<String> list = Arrays.asList("apple", "banana", "cherry");Stream<String> streamFromList = list.stream(); // 順序流Stream<String> parallelStream = list.parallelStream(); // 并行流// 2. 通過 Arrays 類的 stream() 方法Integer[] array = {1, 2, 3, 4, 5};Stream<Integer> streamFromArray = Arrays.stream(array);// 3. 通過 Stream 類的靜態方法:of()、iterate()、generate()Stream<String> streamOf = Stream.of("a", "b", "c");Stream<Integer> streamIterate = Stream.iterate(0, n -> n + 2).limit(5); // 0, 2, 4, 6, 8Stream<Double> streamGenerate = Stream.generate(Math::random).limit(3);// 4. 創建空 StreamStream<String> emptyStream = Stream.empty();}
}

3. Stream 的中間操作

中間操作會返回一個新的 Stream,多個中間操作可以連接成一個流水線。常用操作:

  • 過濾filter(Predicate<T>)
  • 映射map(Function<T, R>)flatMap(Function<T, Stream<R>>)
  • 排序sorted()sorted(Comparator<T>)
  • 去重distinct()
  • 截斷limit(long maxSize)
  • 跳過skip(long n)
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;public class StreamIntermediateOperations {public static void main(String[] args) {List<String> words = Arrays.asList("hello", "world", "java", "stream");// 過濾長度大于4的單詞,并轉為大寫,最后排序Stream<String> result = words.stream().filter(word -> word.length() > 4)     // 過濾長度>4的單詞.map(String::toUpperCase)             // 轉為大寫.sorted();                            // 自然排序result.forEach(System.out::println);      // 輸出: HELLO, WORLD, STREAM}
}

4. Stream 的終止操作

終止操作會觸發流水線的執行并產生結果。常用操作:

  • 遍歷forEach(Consumer<T>)
  • 匹配allMatch()anyMatch()noneMatch()
  • 查找findFirst()findAny()
  • 歸約reduce()
  • 收集collect()
  • 統計count()max()min()
import java.util.*;
import java.util.stream.Collectors;public class StreamTerminalOperations {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 1. 匹配與查找boolean allEven = numbers.stream().allMatch(n -> n % 2 == 0); // falseboolean anyEven = numbers.stream().anyMatch(n -> n % 2 == 0); // trueOptional<Integer> firstEven = numbers.stream().filter(n -> n % 2 == 0).findFirst(); // 2// 2. 歸約:計算總和int sum = numbers.stream().reduce(0, Integer::sum); // 55// 3. 收集:轉為集合或統計List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList()); // [2, 4, 6, 8, 10]// 4. 分組:按奇偶分組Map<Boolean, List<Integer>> groupedByEven = numbers.stream().collect(Collectors.partitioningBy(n -> n % 2 == 0));// 5. 統計IntSummaryStatistics stats = numbers.stream().mapToInt(Integer::intValue).summaryStatistics();System.out.println("Count: " + stats.getCount());     // 10System.out.println("Sum: " + stats.getSum());         // 55System.out.println("Average: " + stats.getAverage()); // 5.5}
}

5. 并行流與串行流

  • 串行流:單線程處理流中的元素。
  • 并行流:內部使用 Fork/Join 框架多線程并行處理(適合大數據量)。
import java.util.Arrays;
import java.util.List;public class ParallelStreamExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 串行流(單線程)numbers.stream().map(n -> {System.out.println(Thread.currentThread().getName() + ": " + n);return n * 2;}).forEach(System.out::println);System.out.println("---");// 并行流(多線程)numbers.parallelStream().map(n -> {System.out.println(Thread.currentThread().getName() + ": " + n);return n * 2;}).forEach(System.out::println);}
}

6. Stream 的惰性求值

中間操作不會立即執行,只有遇到終止操作時才會觸發執行。

import java.util.Arrays;
import java.util.List;public class StreamLaziness {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");// 中間操作不會執行names.stream().filter(name -> {System.out.println("Filtering: " + name);return name.length() > 4;}).map(name -> {System.out.println("Mapping: " + name);return name.toUpperCase();});// 沒有終止操作,不會輸出任何內容// 添加終止操作后觸發執行names.stream().filter(name -> {System.out.println("Filtering: " + name);return name.length() > 4;}).map(name -> {System.out.println("Mapping: " + name);return name.toUpperCase();}).forEach(System.out::println);}
}

總結

Stream API 的核心流程:創建 Stream → 中間操作(過濾、映射等)→ 終止操作(收集結果)。合理使用 Stream 可以讓代碼更簡潔、更具可讀性,同時利用并行流提升大數據處理效率。

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

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

相關文章

相機參數的格式與作用

在計算機視覺中&#xff0c;相機標定是非常重要的一步&#xff0c;主要目的是從圖像中恢復出物體的三維信息。為了做到這一點&#xff0c;我們需要了解和使用一系列的數學工具&#xff0c;這些工具描述了相機的成像過程&#xff0c;包括相機的內參、外參、畸變系數、投影矩陣和…

【jvm|基本原理】第四天

摘要&#xff1a;本文簡單分析了Java虛擬機的核心運行機制。首先介紹了基本數據類型在32位和64位虛擬機中的存儲差異&#xff0c;說明slot槽設計以空間換時間的優化思路。其次詳細解析了對象在堆內存中的存儲結構&#xff0c;包括對象頭、對象數據和對齊填充機制。然后探討了方…

Git高級操作與最佳實踐詳解

前言 熟練掌握Git的高級操作可以顯著提高開發效率&#xff0c;優化工作流程&#xff0c;解決復雜問題。本文將詳細介紹Git的高級操作技巧與最佳實踐&#xff0c;幫助開發者更加高效地管理代碼和協作開發。 1. 提交歷史管理 1.1 修改最近的提交 # 修改最近的提交信息 git co…

ElasticSearch:商品SKU+SPU實現join查詢,設計及優化

文章目錄一、SPUSKU1、商品SPU和SKU2、SPU和SKU的關系3、實現SPUSKU父子嵌套查詢1. **嵌套對象&#xff08;Nested Objects&#xff09;**2. **父子關系&#xff08;Parent-Child&#xff09;**3. **應用層關聯&#xff08;Application-Side Join&#xff09;**&#xff08;推薦…

Objective-c 初階 —— Runtime(方法交換 消息傳遞)

一、消息傳遞1、什么是消息[a func1];我們會把這種用方括號來調函數的方式稱為發消息。對于這個例子&#xff0c;就相當于我們給 a 這個對象發了個 func1 的消息&#xff08;個人認為指令更好理解&#xff09;。2、什么是 selectorselector 就是一個函數區分器。它只會給這個方…

【計算機網絡架構】樹型架構簡介

引言在當今數字化時代&#xff0c;網絡架構如同復雜的神經系統&#xff0c;支撐著各種信息的流通與交互。從個人日常的網絡瀏覽、在線購物&#xff0c;到企業的遠程辦公、數據存儲&#xff0c;再到國家層面的政務信息化、智慧城市建設&#xff0c;網絡架構都扮演著不可或缺的角…

llama-factory快速開始

llama-factory快速開始 文章目錄llama-factory快速開始前言一、環境配置1.1 訓練順利運行需要包含4個必備條件1.2 llama-factory下載1.3 環境下載1.4 硬件環境校驗二、啟動前言 https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md這是GitHub中文介紹文檔&#…

408數據結構強化(自用)

常用代碼片段&#xff08;持續更新&#xff09;折半查找void SearchBinary(int A[];int x){int low 0, high n-1, mid;while(low<high){mid (lowhigh)/2;if(A[mid]x) break;else if(A[mid] < x) low mid 1;else high mid - 1;}順序表逆置void Reverse(SqList &…

linux cpu頻率和AVS調壓等級

1&#xff0c;linux常見的cpu頻率對應的電壓等級對應參數表如下:頻率&#xff08;GHz&#xff09;電壓&#xff08;V&#xff09;1.61.41.41.21.21.01.00.82&#xff0c;avs調壓的幾種方式linux內核宏解釋Linux內核中&#xff0c;AVS調壓的實現依賴于一些宏定義和配置選項&…

Input輸入和Screen相關

知識點using System.Collections; using System.Collections.Generic; using UnityEngine;public class Lesson11 : MonoBehaviour {// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){#region 注意&#xff0c…

如何在CSDN變現?如何賺錢?如何漲粉?如何找到優質大V博主合作伙伴?

&#x1f525; 2025最新 如何在CSDN變現&#xff1f;如何賺錢&#xff1f;如何跟對人&#xff1f;如何找到優質博主合作伙伴&#xff1f; 大家好&#xff0c;我是貓頭虎&#xff0c;今天??想和大家聊聊在CSDN平臺變現的問題。這也是絕大多數伙伴非常關心的一個話題——其實&…

OpenCV特征點提取算法orb、surf、sift對比

下面是 OpenCV 中三種常用特征點提取算法&#xff1a;ORB、SURF 和 SIFT 的詳細對比&#xff0c;從 算法原理、性能、使用限制 和 適用場景 多維度進行總結&#xff0c;幫助大家在實際項目中合理選擇。一覽表&#xff1a;ORB vs. SURF vs. SIFT屬性/算法ORBSURFSIFT全稱Oriente…

LeafletJS 與 React:構建現代地圖應用

引言 LeafletJS 是一個輕量、靈活的 JavaScript 地圖庫&#xff0c;廣泛用于創建交互式 Web 地圖&#xff0c;而 React 作為現代前端框架&#xff0c;以其組件化、狀態管理和虛擬 DOM 特性&#xff0c;成為構建動態用戶界面的首選工具。將 LeafletJS 與 React 結合&#xff0c…

前后端數據交互,關于表單數據傳輸問題

表單提交var formData new FormData(); // 添加每個事故ID作為單獨的參數 accidentIds.forEach(id > formData.append(accidentIds, id)); formData.append(status, statusText); $.messager.confirm(確認, 確定要將事故記錄標記為 statusText 嗎&#xff1f;, function …

新書推介 | 吉林大學出版教材《汽車智能輔助駕駛系統技術》,國產仿真工具鏈GCKontrol-GCAir教學應用

近日&#xff0c;吉林大學出版了由高鎮海教授、孫天駿副教授主編的新教材《汽車智能輔助駕駛系統技術》&#xff0c;本書系統地介紹了汽車智能輔助駕駛系統的發展需求、物理架構、功能算法、技術原理以及應用場景。在教材第17章《仿真測試》&#xff0c;應用國產化GCKontrol-GC…

從 0 到 1 玩轉 XSS - haozi 靶場:環境搭建 + 全關卡漏洞解析

文章目錄前言靶場地址0X00 直接注入0X01 閉合標簽10X02 閉合標簽20X03 繞過特殊符號10X04 繞過特殊符號20X05 繞過注釋符0X06 繞過更多符號0X07 繞過更多符號20X08 繞過閉合符號0X09 繞過URL匹配0X0A 繞過URL過濾0X0B 繞過大寫轉換10X0C 繞過大寫轉換20X0D 繞過注釋0X0E 古英語…

TF卡格式化

cmd 輸入diskpart,在新打開的窗口輸入list disk&#xff0c;然后select disk [磁盤號]&#xff0c;clean&#xff0c;回車變成未分區的。再選中磁盤&#xff0c;選中之后create partition [分區名] 回車&#xff0c;list partition&#xff0c;查看分區&#xff0c;輸入active&…

Python爬蟲實戰:研究sqlparse庫相關技術

1. 引言 1.1 研究背景與意義 在當今數據驅動的時代,SQL 作為關系型數據庫的標準查詢語言,被廣泛應用于各種數據處理和分析場景。隨著數據庫應用的不斷發展,SQL 代碼的規模和復雜度也在不斷增加,這給 SQL 代碼的編寫、維護和優化帶來了挑戰。 研究表明,低效的 SQL 查詢是…

全球天氣預報5天(經緯度版)免費API接口教程

本文全面介紹由接口盒子免費API提供的全球天氣預報API&#xff0c;支持通過經緯度坐標獲取任意地區未來5天的詳細天氣預報數據。 一、接口核心功能 ?全球覆蓋?&#xff1a;支持全球任意經緯度坐標點的天氣預報?高精度預報?&#xff1a;提供每3小時為間隔的精細化預報&…

5 基于STM32單片機的絕緣檢測系統設計(STM32代碼編寫+手機APP設計+PCB設計+Proteus仿真)

系列文章目錄 文章目錄 系列文章目錄前言1 1 資料獲取與演示視頻1.1 資料介紹1.2 資料獲取1.3 演示視頻 2 系統框架3 硬件3.1 主控制器3.2 顯示屏3.3 WIFI模塊3.4 DHT11溫濕度傳感器3.5 可調電位器 4 設計PCB4.1 安裝下載立創EDA專業版4.2 畫原理圖4.3 擺放元器件&#xff0c;設…