Java 8 引入了 Lambda 表達式,並支援匿名內部類別存取局部變數。 Java 9 允許 Lambda 表達式擷取局部變量,而 Java 10 實作了局部變數類型推斷,編譯器可推斷 Lambda 表達式參數和傳回類型。實戰案例展示了不同 Java 版本中 Lambda 表達式對局部變數存取和類型推論的影響。
Java 版本對Lambda 表達式的影響
簡介
Lambda 表達式是Java 8 中引入的關鍵特性,它允許我們將函數宣告為物件的實例。在 Java 8 之前,我們只能使用匿名內部類別來實作函數。
Java 8
在 Java 8 中,Lambda 表達式由箭頭符號 (->) 表示,它將輸入參數與函數體分隔開來。例如:
(x) -> x + 1
這個 Lambda 表達式採用一個 int 輸入參數並傳回 x 1。
Java 9
Java 9 引入了 Lambda 表達式的局部變數擷取的支援。這意味著 Lambda 表達式現在可以存取其作用域中的局部變量,即使它們不是 final 類型。例如:
int y = 5; (x) -> x + y
這個 Lambda 表達式可以存取局部變數 y,即使它不是 final 類型。
Java 10
Java 10 引入了對 Lambda 表達式的局部變數類型推斷的支援。這意味著編譯器可以推斷 Lambda 表達式參數和傳回類型的類型,無需我們明確聲明它們。例如:
(x, y) -> x + y
這個 Lambda 表達式可以推論出輸入參數的型別為 int,傳回型別的型別為 int,即使我們沒有明確地宣告它們。
實戰案例
以下是一個展示不同Java 版本對Lambda 表達式影響的實戰案例:
// Java 8 public static void main(String[] args) { int y = 5; // 匿名内部类 Runnable runnable = new Runnable() { @Override public void run() { System.out.println(y); // 无法访问 } }; // Lambda 表达式 Runnable lambda = () -> System.out.println(y); // 无法访问 }
在Java 8 中,匿名內部類別無法存取作用域中的局部變數y,因為它們不是final 類型。 Lambda 表達式也無法存取 y,因為在這個 Java 版本中不支援局部變數擷取。
// Java 9 public static void main(String[] args) { int y = 5; // 匿名内部类 Runnable runnable = new Runnable() { @Override public void run() { System.out.println(y); // 可以访问 } }; // Lambda 表达式 Runnable lambda = () -> System.out.println(y); // 可以访问 }
在 Java 9 中,匿名內部類別和 Lambda 表達式現在都可以存取作用域中的局部變數 y,因為實現了對局部變數擷取的支援。
// Java 10 public static void main(String[] args) { int y = 5; // Lambda 表达式,自动推断类型 Runnable lambda = (x) -> { System.out.println(x + y); }; }
在 Java 10 中,Lambda 表達式可以自動推斷其輸入參數和傳回類型的類型。因此,我們不必在 Lambda 表達式中明確聲明輸入參數和傳回類型的類型。
以上是不同Java版本對函數的影響的詳細內容。更多資訊請關注PHP中文網其他相關文章!