標籤:interface rate get pre lam blank tin 引用 文法
內容來源於菜鳥教程(侵刪)
Lambda 運算式,也可稱為閉包,它是推動 Java 8 發布的最重要新特性。
Lambda 允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)。
使用 Lambda 運算式可以使代碼變的更加簡潔緊湊。
文法
lambda 運算式的文法格式如下:
(parameters) -> expression 或 (parameters) ->{ statements; }
以下是lambda運算式的重要特徵:
- 可選型別宣告:不需要聲明參數類型,編譯器可以統一識別參數值。
- 可選的參數圓括弧:一個參數無需定義圓括弧,但多個參數需要定義圓括弧。
- 可選的大括弧:如果主體包含了一個語句,就不需要使用大括弧。
- 可選的返回關鍵字:如果主體只有一個運算式傳回值則編譯器會自動傳回值,大括弧需要指定明運算式返回了一個數值。
Lambda 運算式執行個體
在 Java8Tester.java 檔案輸入以下代碼:
Java8Tester.java 檔案
public class Java8Tester { public static void main(String args[]){ Java8Tester tester = new Java8Tester(); // 型別宣告 MathOperation addition = (int a, int b) -> a + b; // 不用型別宣告 MathOperation subtraction = (a, b) -> a - b; // 大括弧中的返回語句 MathOperation multiplication = (int a, int b) -> { return a * b; }; // 沒有大括弧及返回語句 MathOperation division = (int a, int b) -> a / b; System.out.println("10 + 5 = " + tester.operate(10, 5, addition)); System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction)); System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication)); System.out.println("10 / 5 = " + tester.operate(10, 5, division)); // 不用括弧 GreetingService greetService1 = message -> System.out.println("Hello " + message); // 用括弧 GreetingService greetService2 = (message) -> System.out.println("Hello " + message); greetService1.sayMessage("Runoob"); greetService2.sayMessage("Google"); } interface MathOperation { int operation(int a, int b); } interface GreetingService { void sayMessage(String message); } private int operate(int a, int b, MathOperation mathOperation){ return mathOperation.operation(a, b); } }
執行以上指令碼,輸出結果為:
$ javac Java8Tester.java $ java Java8Tester10 + 5 = 1510 - 5 = 510 x 5 = 5010 / 5 = 2Hello RunoobHello Google
使用 Lambda 運算式需要注意以下兩點:
- Lambda 運算式主要用來定義行內執行的方法類型介面,例如,一個簡單方法介面。在上面例子中,我們使用各種類型的Lambda運算式來定義MathOperation介面的方法。然後我們定義了sayMessage的執行。
- Lambda 運算式免去了使用匿名方法的麻煩,並且給予Java簡單但是強大的函數化的編程能力。
變數範圍
lambda 運算式只能引用 final 或 final 局部變數,這就是說不能在 lambda 內部修改定義在域外的局部變數,否則會編譯錯誤。
在 Java8Tester.java 檔案輸入以下代碼:
Java8Tester.java 檔案
public class Java8Tester { final static String salutation = "Hello! "; public static void main(String args[]){ GreetingService greetService1 = message -> System.out.println(salutation + message); greetService1.sayMessage("Runoob"); } interface GreetingService { void sayMessage(String message); } }
執行以上指令碼,輸出結果為:
$ javac Java8Tester.java $ java Java8TesterHello! Runoob
Java 8 Lambda 運算式