Java 流(Stream)API

一、理論說明

1. 流的定義

Java 流(Stream)是 Java 8 引入的新特性,用于對集合(如 List、Set)或數組進行高效的聚合操作(如過濾、映射、排序)和并行處理。流不存儲數據,而是按需計算,支持鏈式調用,使代碼更簡潔、易讀。

2. 流與集合的區別

特性集合(Collection)流(Stream)
數據存儲存儲元素,占用內存不存儲數據,按需計算
遍歷方式外部迭代(手動 for/foreach)內部迭代(自動處理)
一次性使用可重復遍歷只能消費一次(類似迭代器)
延遲執行立即執行中間操作延遲,終止操作觸發執行
并行支持需要手動實現多線程直接支持并行流(parallelStream()

二、流的創建與操作

1. 創建流

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;public class StreamExample {public static void main(String[] args) {// 1. 從集合創建List<String> list = Arrays.asList("a", "b", "c");Stream<String> stream = list.stream();// 2. 從數組創建String[] array = {"a", "b", "c"};Stream<String> arrayStream = Arrays.stream(array);// 3. 使用 Stream.of()Stream<String> ofStream = Stream.of("a", "b", "c");// 4. 創建無限流Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2);infiniteStream.limit(5).forEach(System.out::println); // 輸出: 0, 2, 4, 6, 8}
}

2. 中間操作(返回新的流)

使用時需注意:流只能消費一次,消費后需重新創建。并行流適用于計算密集型任務,避免 I/O 操作。合理選擇中間操作和終止操作,避免過度使用復雜流。流 API 是 Java 8 最具影響力的特性之一,廣泛應用于數據處理、微服務、ORM 框架等場景。

  • 過濾filter(Predicate<T>)
  • 映射map(Function<T, R>)
  • 排序sorted()?或?sorted(Comparator<T>)
  • 去重distinct()
  • 截斷limit(long maxSize)
  • 跳過skip(long n)
    List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 5);
    List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0)    // 過濾偶數.distinct()                // 去重.sorted()                  // 排序.collect(Collectors.toList()); // [2, 4]

    3. 終止操作(觸發計算并關閉流)

  • 聚合count(),?max(),?min()
  • 匹配anyMatch(),?allMatch(),?noneMatch()
  • 收集collect(Collectors.toList()),?toSet(),?toMap()
  • 歸約reduce()
  • 遍歷forEach()
    List<String> words = Arrays.asList("apple", "banana", "cherry");// 計算總長度
    int totalLength = words.stream().mapToInt(String::length).sum(); // 結果: 5 + 6 + 6 = 17// 檢查是否所有單詞長度大于 3
    boolean allLong = words.stream().allMatch(w -> w.length() > 3); // true

    三、并行流(Parallel Stream)

    通過parallelStream()stream().parallel()創建并行流,利用多線程加速處理(適用于大數據量)。

    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    int sum = numbers.parallelStream().mapToInt(Integer::intValue).sum();

    注意:并行流的線程安全問題,避免在流操作中修改共享狀態。

    四、Collectors 工具類

    Collectors提供了豐富的收集器,用于將流結果轉換為集合、Map 或進行分組統計。

    1. 集合收集

    List<String> names = people.stream().map(Person::getName).collect(Collectors.toList());

    2. 分組統計

    Map<Integer, List<Person>> ageGroups = people.stream().collect(Collectors.groupingBy(Person::getAge));

    3. 字符串連接

    String joined = people.stream().map(Person::getName).collect(Collectors.joining(", ", "[", "]"));
    // 結果: "[Alice, Bob, Charlie]"

    五、應用實例

    1. 篩選與映射

    class Product {private String name;private double price;private Category category;// 構造方法、getter/setter 略
    }enum Category { FOOD, ELECTRONICS, CLOTHING }// 統計電子產品的平均價格
    List<Product> products = getProductList();
    double avgPrice = products.stream().filter(p -> p.getCategory() == Category.ELECTRONICS).mapToDouble(Product::getPrice).average().orElse(0.0);

    2. 分頁處理

    List<Product> page2 = products.stream().skip(10)  // 跳過前10條.limit(10) // 取10條.collect(Collectors.toList());

    六、自我總結

  • Java 流 API 提供了一種高效、優雅的方式處理集合數據,其核心優勢包括:

  • 代碼簡潔:鏈式調用減少冗余代碼。
  • 內部迭代:自動處理遍歷邏輯,提升可讀性。
  • 并行支持:簡化多線程編程,提升大數據處理性能。
  • 延遲執行:避免不必要的計算,優化性能。

    ??七、面試題

    題目:

    答案;

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

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

相關文章

網絡協議分析 實驗七 FTP、HTTP、DHCP

文章目錄 實驗7.1 FTP協議練習二 使用瀏覽器登入FTP練習三 在窗口模式下&#xff0c;上傳/下傳數據文件實驗7.2 HTTP(Hyper Text Transfer Protocol)練習二 頁面提交練習三 訪問比較復雜的主頁實驗7.3 DHCP(Dynamic Host Configuration Protocol) 實驗7.1 FTP協議 dir LIST&…

go語言學習進階

目錄 第一章 go語言中包的使用 一.main包 二.package 三.import 四.goPath環境變量 五.init包初始化 六.管理外部包 第二章 time包 第三章 File文件操作 一.FileInfo接口 二.權限 三.打開模式 四.File操作 五.讀文件 參考1&#xff1a;Golang 中的 bufio 包詳解…

Hue面試內容整理-后端框架

Cloudera 的 Hue 項目在后端采用了成熟的 Python Web 框架 Django,結合其他組件構建了一個可擴展、模塊化的系統,便于與 Hadoop 生態系統中的各個組件集成。以下是 Hue 后端架構的詳細介紹: 后端架構概覽 1. Django Web 框架 Hue 的核心是基于 Django 構建的 Web 應用,負責…

Web-CSS入門

WEB前端&#xff0c;三部分&#xff1a;HTML部分、CSS部分、Javascript部分。 1.HTML部分&#xff1a;主要負責網頁的結構層 2.CSS部分&#xff1a;主要負責網頁的樣式層 3.JS部分&#xff1a;主要負責網頁的行為層 **基本概念** 層疊樣式表&#xff0c;Cascading Style Sh…

2025年PMP 學習十六 第11章 項目風險管理 (總章)

2025年PMP 學習十六 第11章 項目風險管理 &#xff08;總章&#xff09; 第11章 項目風險管理 序號過程過程組1規劃風險管理規劃2識別風險規劃3實施定性風險分析規劃4實施定量風險分析規劃5規劃風險應對執行6實施風險應對執行7監控風險監控 目標: 提高項目中積極事件的概率和…

基于SpringBoot的小區停車位管理系統

作者&#xff1a;計算機學姐 開發技術&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源碼”。 專欄推薦&#xff1a;前后端分離項目源碼、SpringBoot項目源碼、Vue項目源碼、SSM項目源碼、微信小程序源碼 精品專欄&#xff1a;…

HTML常用標簽用法全解析:構建語義化網頁的核心指南

HTML作為網頁開發的基石&#xff0c;其標簽的合理使用直接影響頁面的可讀性、SEO效果及維護性。本文系統梳理HTML核心標簽的用法&#xff0c;結合語義化設計原則與實戰示例&#xff0c;助你構建規范、高效的網頁結構。 一、基礎結構與排版標簽 1.1 文檔結構 <!DOCTYPE htm…

國產linux系統(銀河麒麟,統信uos)使用 PageOffice自定義Word模版中的數據區域

? PageOffice 國產版 &#xff1a;支持信創系統&#xff0c;支持銀河麒麟V10和統信UOS&#xff0c;支持X86&#xff08;intel、兆芯、海光等&#xff09;、ARM&#xff08;飛騰、鯤鵬、麒麟等&#xff09;、龍芯&#xff08;Mips、LoogArch&#xff09;芯片架構。 在實際的Wor…

.NET Core liunx二進制文件安裝

最近遇見個尷尬的事情&#xff0c;都2025年了。我需要部署一個自己多年前寫的項目。由于時間緊、任務重&#xff0c;我懶得去升級到8.0了。于是計劃在Ubuntu20.04上安裝.NET Core3.1項目。可以使用包管理器卻安裝不上了。于是&#xff0c;我就嘗試二進制文件安裝。 實際上二進…

【python基礎知識】Day 27 函數專題2:裝飾器

知識點&#xff1a; 裝飾器的思想&#xff1a;進一步復用函數的裝飾器寫法注意內部函數的返回值 裝飾器教程 作業&#xff1a; 編寫一個裝飾器 logger&#xff0c;在函數執行前后打印日志信息&#xff08;如函數名、參數、返回值&#xff09; def logger(func):def wrapper(*ar…

MGX:多智能體管理開發流程

MGX的多智能體團隊如何通過專家混合系統采用全新方法,徹底改變開發流程,與當前的單一智能體工具截然不同。 Lovable和Cursor在自動化我們的特定開發流程方面取得了巨大飛躍,但問題是它們僅解決軟件開發的單一領域。 這就是MGX(MetaGPT X)的用武之地,它是一種正在重新定…

【未完】【GNN筆記】EvolveGCN:Evolving Graph Convolutional Networks for Dynamics Graphs

Evolving Graph Convolutional Networks for Dynamics Graphs 視頻鏈接&#xff1a;《圖神經網絡》 相關系列&#xff1a; 《Dynamic Graph的分類》《動態圖網絡之Dynamic Self-Attention Network》 文章目錄 Evolving Graph Convolutional Networks for Dynamics Graphs一、…

Go語言之路————并發

Go語言之路————并發 前言協程管道SelectsyncWaitGroup鎖 前言 我是一名多年Java開發人員&#xff0c;因為工作需要現在要學習go語言&#xff0c;Go語言之路是一個系列&#xff0c;記錄著我從0開始接觸Go&#xff0c;到后面能正常完成工作上的業務開發的過程&#xff0c;如…

Gmsh劃分網格|四點矩形

先看下面這段官方自帶腳本 /*********************************************************************** Gmsh tutorial 1** Variables, elementary entities (points, curves, surfaces), physical* entities (points, curves, surfaces)********************************…

leetcode0215. 數組中的第K個最大元素-medium

1 題目&#xff1a;數組中的第K個最大元素 官方標定難度&#xff1a;中 給定整數數組 nums 和整數 k&#xff0c;請返回數組中第 k 個最大的元素。 請注意&#xff0c;你需要找的是數組排序后的第 k 個最大的元素&#xff0c;而不是第 k 個不同的元素。 你必須設計并實現時…

rocketmq 環境配置[python]

因本人是 python 開發&#xff0c;macbook 開發。windows 可以采取配置遠程 linux 解釋器或者 pycharm 專業版的 docker 解釋器進行開發 M1 芯片 本地運行 rocketmq rocketmq Python 開源地址&#xff1a; https://github.com/apache/rocketmq-client-python 因為需要 linu…

OCCT知識筆記之OCAF框架詳解

OCAF框架在OCCT項目中的構建與使用指南 Open CASCADE Application Framework (OCAF)是Open CASCADE Technology (OCCT)中用于管理CAD數據的核心框架&#xff0c;它提供了一種結構化方式來組織和管理復雜的CAD數據&#xff0c;如裝配體、形狀、屬性(顏色、材料)和元數據等。本文…

go-數據庫基本操作

1. 配置數據庫 package mainimport ("gorm.io/driver/mysql""gorm.io/gorm" ) #配置表結構 type User struct {ID int64 json:"id" gorm:"primary_key" // 主鍵ID自增長Username stringPassword string } #配置連接接信息 func…

【含文檔+PPT+源碼】基于大數據的交通流量預測系統

技術棧說明 技術棧&#xff1a; 后端&#xff1a;Django&#xff08;后端是前后端分離的&#xff09; 前端&#xff1a;Vue.js ElementUI 開發工具&#xff1a; Python3.9以上 Pycharm MySQL5.7/MySQL8 VSCode 項目演示視頻 基于大數據的交通流量預測系統

海盜王3.0的數據庫3合1并庫處理方案

原版的海盜王數據庫有3個accountserver&#xff0c;gamedb&#xff0c;tradedb&#xff0c;對應到是賬號數據庫&#xff0c;游戲數據庫&#xff0c;商城數據庫。 一直都有個想法&#xff0c;如何把這3個庫合并到一起&#xff0c;這樣可以實現一些功能。 涉及到sqlserver的數據庫…