Java 8 Lambda 表達式
Lambda 表達式,也可稱為閉包,它是推動Java 8 發布的最重要新特性。
Lambda 允許把函數作為一個方法的參數(函數作為參數傳遞進方法中)。
使用Lambda 表達式可以使代碼變的更加簡潔緊湊。
語法
lambda 表達式的語法格式如下:
(parameters) -> expression 或 (parameters) ->{ statements; }
以下是lambda表達式的重要特徵:
- 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
- 可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。
- 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
- 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。
Lambda 表達式實例
在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("w3big"); 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 Java8Tester 10 + 5 = 15 10 - 5 = 5 10 x 5 = 50 10 / 5 = 2 Hello w3big Hello Google
使用Lambda 表達式需要注意以下兩點:
- Lambda 表達式主要用來定義行內執行的方法類型接口,例如,一個簡單方法接口。 在上面例子中,我們使用各種類型的Lambda表達式來定義MathOperation接口的方法。 然後我們定義了sayMessage的執行。
- Lambda 表達式免去了使用匿名方法的麻煩,並且給予Java簡單但是強大的函數化的編程能力。
變量作用域
lambda 表達式只能引用final 或final 局部變量,這就是說不能在lambda 內部修改定義在域外的變量,否則會編譯錯誤。
在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("w3big"); } interface GreetingService { void sayMessage(String message); } }
執行以上腳本,輸出結果為:
$ javac Java8Tester.java $ java Java8Tester Hello! w3big