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

Java 8 Lambda 表達式全面解析:語法、原理與實戰

     編輯:Java 相關知識

為什麼需要 Lambda?

Java SE 5 泛型以來最大語言變革。三大驅動力:

  1. 更緊湊代碼:替代冗長匿名內部類(Runnable、Callable、Listener 等)
  2. 行為參數化:將代碼作為數據傳遞,動態定制方法邏輯(如忽略大小寫查找)
  3. 多核並行:配合 Stream API,輕鬆並行處理大集合(filter/map/reduce 模式)

核心概念

  • Lambda 是**可傳遞的小函數**(行為參數化)
  • 集合內部迭代(forEach、stream())替代外部手動迭代,支援並行

語法速覽


// 無參無返回
() -> System.out.println("Hello")

// 單參數,隱式返回
(String s) -> s.length()
// 或
s -> s.length()

// 多參數,代碼塊,顯式返回
(int a, int b) -> { return a + b; }

// 方法引用:類::靜態方法、對象::實例方法、類::實例方法、構造器引用
String::valueOf
System.out::println
String::compareToIgnoreCase
ArrayList::new

函數式介面

Lambda 只能賦值給**單一抽象方法(SAM)**的介面。JDK 8 提供豐富內置函數式介面(java.util.function):

實戰:從匿名類到 Lambda

FileFilter 過濾目錄


// 匿名內部類 (Java 7)
FileFilter filter = new FileFilter() {
    public boolean accept(File f) { return f.isDirectory(); }
};

// Lambda (Java 8)
FileFilter filter = (File f) -> f.isDirectory();
// 類型推導進一步簡化
FileFilter filter = f -> f.isDirectory();

Stream API 三大核心模式

List list = Arrays.asList("a", "bb", "ccc", "dddd");

// 1. Filter (過濾)
list.stream().filter(s -> s.length() > 2).forEach(System.out::println);

// 2. Map (映射/轉換)
list.stream().map(String::toUpperCase).forEach(System.out::println);

// 3. Reduce (化簡/聚合)
int totalLen = list.stream().mapToInt(String::length).sum();
// 或
String concat = list.stream().reduce("", (a, b) -> a + b);

並行流:一鍵啟用多核


// 串行
list.stream().filter(...).map(...).forEach(...);

// 並行(自動利用所有 CPU 核心)
list.parallelStream().filter(...).map(...).forEach(...);

無需手動管理線程池、分割任務、合併結果,框架自動完成。

變量捕獲規則

  • Lambda 只能捕獲 **final 或 effectively final** 的局部變量(不可在 Lambda 中修改外部局部變量)
  • 實例變量、靜態變量無此限制

默認方法:介面演進的關鍵

JDK 8 允許介面定義 default 方法,使 Collection 等舊介面可平滑添加 stream()、forEach() 等方法而不破壞現有實現類。

總結

Lambda + Stream API 徹底改變了 Java 集合處理方式:聲明式、可組合、可並行。掌握函數式介面、方法引用、三大核心模式、並行流、變量捕獲規則,即可編寫現代、高效、可維護的 Java 代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
介面參數返回用途
Predicate<T>Tboolean過濾判斷
Function<T,R>TR轉換映射
Consumer<T>Tvoid消費處理
Supplier<T>無T供給生成
UnaryOperator<T>TT一元運算
BinaryOperator<T>T,TT二元運算