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

Java 8 Lambda 表達式完整指南:語法、函數式介面、變數捕獲與類型推論

     編輯:Java 相關知識

為什麼需要 Lambda?

Java 8 前,傳遞行為需用匿名內部類,程式碼冗長。Lambda 讓函數成為一等公民,支援函數式程式設計風格。

// 匿名內部類
Runnable r1 = new Runnable() {
    @Override public void run() { System.out.println("Hello"); }
};

// Lambda 簡潔版
Runnable r2 = () -> System.out.println("Hello Lambda!");

Lambda 完整語法形式

形式範例說明
無參數() -> System.out.println("Hi")() 不可省略
單參數x -> x * 2 或 (x) -> x * 2括號可省略
多參數(int x, int y) -> x + y建議顯式宣告型別
程式碼區塊(x, y) -> { int z = x + y; return z; }需 {} 與 return
型別推論BinaryOperator<Long> add = (x, y) -> x + y;編譯器自動推斷參數型別

核心概念深度解析

函數式介面

僅含單一抽象方法的介面,可隱式轉換為 Lambda。JDK 內建 java.util.function 提供豐富預設介面:

  • Predicate<T>:boolean test(T t)
  • Function<T,R>:R apply(T t)
  • Consumer<T>:void accept(T t)
  • Supplier<T>:T get()
  • BinaryOperator<T>:T apply(T t1, T t2)
@FunctionalInterface
public interface AddOperator<T, D> {
    long add(T one, D two);
}

// 使用
AddOperator<Long, Long> op = (x, y) -> x + y;
System.out.println(op.add(34L, 65L)); // 99

目標型別與型別推論

Lambda 本身無型別,其型別由上下文(賦值目標、方法參數、回傳型別)決定,稱為「目標型別」。編譯器依此推斷參數與回傳型別。

變數捕獲規則

  • 捕獲的區域變數必須是 final 或 effectively final(僅賦值一次)
  • 不可在 Lambda 中修改捕獲變數
  • 實例/靜態變數無此限制
String name = getName(); // effectively final
button.addActionListener(e -> System.out.println(name));
// name = "new"; // 編譯錯誤:變數不再 effectively final

方法參考

Lambda 的語法糖,四種形式:

  • 靜態方法參考:ClassName::staticMethod
  • 實例方法參考:instance::method
  • 任意物件實例方法:ClassName::method
  • 建構子參考:ClassName::new

實務應用場景

  • 集合串流處理:list.stream().filter(...).map(...).collect(...)
  • 併發執行:executor.submit(() -> doWork())
  • 事件處理:button.onAction(e -> handle())
  • 策略模式簡化:以 Lambda 替換策略類

掌握 Lambda 是邁向現代 Java 開發的關鍵,配合 Stream API 與 Optional 可寫出更具表達力、可維護的程式碼。

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