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

Java Lambda 語法深度解析:目標類型推導、變數捕獲與序列化機制

     編輯:Java 相關知識

語法三要素

  1. 參數列表:(int a, int b)、(a, b)、a(單參數可省括號)
  2. 箭頭符號:->
  3. 方法體:表達式(隱式返回)或代碼塊 { return ...; }

目標類型推導

Lambda 本身**無獨立類型**,類型由**上下文目標類型**決定:

// 同一 Lambda,不同目標類型
Runnable r = () -> System.out.println("hi");      // 目標類型 Runnable
Callable<Void> c = () -> { System.out.println("hi"); return null; } // 目標類型 Callable

編譯器根據**目標類型的唯一抽象方法簽名**推導 Lambda 參數類型、返回類型、拋出異常。

目標類型上下文位置

  • 變數宣告/賦值
  • 方法/建構子參數
  • 返回語句
  • 陣列初始化
  • 三元運算子、強制轉型

重載解析與類型參數推導

void execute(Runnable r) { r.run(); }
<T> T execute(Callable<T> c) { return c.call(); }

String s = execute(() -> "done"); // 呼叫 Callable 版本,因有返回值

變數捕獲語義

  • 詞法作用域:Lambda 不引入新作用域,this、區域變數直接指向外層
  • Effectively Final:捕獲區域變數不可重新賦值(含隱式 ++/--)
  • 實例/靜態欄位無限制
int x = 1;
Runnable r = () -> System.out.println(x); // OK
// x = 2; // 編譯錯誤:x 不再 effectively final

序列化條件

Lambda 可序列化 **iff** 目標類型實作 Serializable 且所有捕獲參數可序列化。但官方**強烈不建議**序列化 Lambda(內部類同樣),因跨版本/編譯器穩定性無保障。

多參數實例:計算器策略

@FunctionalInterface
interface IntMath { int op(int a, int b); }

IntMath add = (a, b) -> a + b;
IntMath sub = (a, b) -> a - b;
int r = calculate(40, 2, add); // 42

掌握 Lambda 語法細節,能精準控制類型推導、避免捕獲陷阱、編寫更健壯的函數式代碼。

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