首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 8 Stream API 核心指南:從入門到並行實戰

     編輯:Java 綜合教學

Java 8 Stream API 核心指南:從入門到並行實戰

一、什麼是 Stream?

Stream ≠ java.io 流。它是 Java 8 引入的函數式編程抽象,源自範疇論中的 Monad 概念:將計算過程拆解為一系列可鏈接的步驟,支持鏈式操作、惰性求值、並行計算。簡單說:Stream 是對集合數據的高層抽象,聲明式處理數據流。

經典入門示例

List<String> list = Arrays.asList("a1", "a2", "b1", "c2", "c1");
list.stream()
    .filter(s -> s.startsWith("c"))   // 篩選以 c 開頭
    .map(String::toUpperCase)         // 轉大寫
    .sorted()                         // 排序
    .forEach(System.out::println);    // 終端操作:輸出 C1, C2

二、Stream 核心特征

  • 非數據結構:不存儲數據,只操作數據源
  • 為 Lambda 設計:所有中間/終端操作接受函數式接口
  • 無索引訪問:只能順序或並行遍歷
  • 易於輸出:collect()、toArray() 轉集合/數組
  • 惰性求值:中間操作不執行,遇終端操作才觸發遍歷
  • 原生並行:parallelStream() 一鍵啟用 Fork/Join 框架

三、獲取 Stream 的 5 大途徑

四、操作分類:中間操作 vs 終端操作

中間操作 —— 惰性、可鏈接、返回新 Stream

  • filter(Predicate):篩選
  • map(Function):轉換
  • sorted() / sorted(Comparator):排序
  • distinct():去重
  • limit(n) / skip(n):截取/跳過
  • peek(Consumer):側效調試(不修改元素)

終端操作 —— 觸發遍歷、產生結果、消費 Stream

  • forEach(Consumer):遍歷消費
  • collect(Collector):歸約為集合/Map/字符串
  • toArray():轉數組
  • reduce():聚合(求和、拼接、最值)
  • count() / min() / max():統計
  • anyMatch/allMatch/noneMatch:匹配判斷
  • findFirst/findAny:查找

五、核心 API 實戰速查

1. 創建與收集

// 數組 -> Stream -> List
Integer[] arr = {1,2,3,4,5,6,7,8,9};
List<Integer> evens = Arrays.stream(arr)
    .filter(i -> i % 2 == 0)
    .collect(Collectors.toList()); // [2,4,6,8]

// Stream -> 數組
Integer[] evenArr = evens.stream().toArray(Integer[]::new);

2. 篩選、轉換、排序

List<String> names = Arrays.asList("Amitabh","Shekhar","Aman","Rahul");
names.stream()
    .filter(s -> s.startsWith("A"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println); // AMAN, AMITABH

3. 匹配與統計

boolean anyA = names.stream().anyMatch(s -> s.startsWith("A")); // true
long countA = names.stream().filter(s -> s.startsWith("A")).count(); // 2

4. reduce 聚合(字符串拼接/求和/最值)


5. 短路操作(提前終止)

 s.startsWith("L"))
    .findFirst().orElse("N/A"); // Lokesh

六、並行流:零成本多核加速

List<String> strings = Arrays.asList("abc","111","bc","efg","12584","","1254");

// Java 7 命令式
long count7 = 0;
for (String s : strings) if (s.length() == 3) count7++;

// Java 8 聲明式
long count8 = strings.stream().filter(s -> s.length() == 3).count();
// 兩者結果均為 3

八、最佳實踐建議

  1. 優先使用方法引用(String::toUpperCase)提升可讀性
  2. 避免在 Stream 中修改共享狀態,保持純函數特性
  3. 大數據量、CPU 密集型才考慮 parallelStream()
  4. 收集器靈活運用:Collectors.groupingBy、partitioningBy、joining、summarizingInt
  5. 調試技巧:插入 .peek(System.out::println) 觀察中間流狀態

九、參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
來源方法示例
Collectionstream() / parallelStream()list.stream()
數組Arrays.stream() / Stream.of()Stream.of(1,2,3)
BufferedReaderlines()br.lines()
靜態工廠IntStream.range() / Files.walk()IntStream.range(1,10)
其他Random.ints() / Pattern.splitAsStream() / JarFile.stream()new Random().ints(5)