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

Java 函數式編程(二):Stream API 集合操作入門

     編輯:Java 相關知識

前言

Java 8 Stream API 將集合操作從「如何做」(命令式)提升為「做什麼」(聲明式)。本文通過對比傳統迴圈與 Stream 寫法,建立函數式集合處理的直觀認知。

場景:過濾、轉換、收集

需求:從名字列表中篩選長度 > 3 的名字,轉大寫,收集為新列表。

傳統寫法

List<String> result = new ArrayList<>();
for (String name : names) {
    if (name.length() > 3) {
        result.add(name.toUpperCase());
    }
}

Stream 寫法

List<String> result = names.stream()
    .filter(name -> name.length() > 3)
    .map(String::toUpperCase)
    .collect(Collectors.toList());

Stream 三大階段

  1. 創建:collection.stream()、Arrays.stream(array)、Stream.of(...)
  2. 中間操作(惰性、可鏈式):
    • filter(Predicate) 篩選
    • map(Function) 轉換
    • flatMap(Function) 扁平化
    • distinct() 去重
    • sorted(Comparator) 排序
    • limit/skip 截取
  3. 終端操作(觸發執行):
    • collect(Collector) 收集
    • forEach(Consumer) 遍歷
    • reduce 歸約
    • count/min/max 聚合
    • anyMatch/allMatch/noneMatch 判斷

並行流一鍵切換

// 串行
names.stream().filter(...).map(...).collect(...);

// 並行(多核自動分片)
names.parallelStream().filter(...).map(...).collect(...);

注意:並行流有線程池開銷,小數據量反而較慢;有狀態操作(如 limit)並行效果不穩定。

常見誤區避坑

誤區正確認知
Stream 可復用Stream 只能消費一次,再用需重新創建
中間操作立即執行惰性求值,終端操作才觸發
forEach 內修改外部變量禁止副作用,用 collect/reduce 替代
parallelStream 總是更快需數據量大、CPU 密集、無共享狀態

實戰:統計單詞頻率 Top 10

List<String> words = Files.lines(Paths.get("article.txt"))
    .flatMap(line -> Arrays.stream(line.split("\\W+")))
    .filter(w -> !w.isEmpty())
    .map(String::toLowerCase)
    .collect(Collectors.groupingBy(w -> w, Collectors.counting()))
    .entrySet().stream()
    .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
    .limit(10)
    .collect(Collectors.toMap(
        Map.Entry::getKey, Map.Entry::getValue,
        (a, b) -> a, LinkedHashMap::new
    ));

總結

Stream API 以 filter-map-collect 為核心模式,配合 flatMap、groupingBy 等進階收集器,能用流水線風格表達複雜集合邏輯。掌握「惰性中間操作 + 終端觸發」模型,是寫出高性能 Stream 代碼的關鍵。下一篇將深入 MapReduce 模式與 reduce 歸約操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved