Lambda表達式是在java規范提案JSR 335中定義的,Java 8 中引入了Lambda表達式,並被認為是Java 8最大的新特性,Lambda表達式促進了函數式編程,簡化了Java編程開發。
在Java中,匿名內部類一般適用於那些在Java應用中只會出現一次的實現類,舉個例子,在標准的Swing或JavaFX應用中,有很多鍵盤和鼠標的事件處理程序,一般情況下,你不需要寫一個單獨的事件處理類,而是使用如下方式(有Swing編程經驗的應該很熟悉吧):
JButton testButton = new JButton("Test Button"); testButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { System.out.println("Click Detected by Anon Class"); } });
不這樣做的話,你需要針對每一個事件寫一個單獨的ActionListener接口的實現類,這樣的代碼並不優雅,因為僅僅為了定義一個方法就需要附加寫一大堆的代碼。通常,哪裡需要,就在哪裡創建對應的匿名內部類,這樣的代碼可讀性會更強。
首選,我們來觀察下上面提到的ActionListener接口的定義,如下:
package java.awt.event; import java.util.EventListener; public interface ActionListener extends EventListener { /** * Invoked when an action occurs. */ public void actionPerformed(ActionEvent e); }
在上面的代碼中,只定義了一個方法,在Java 8中,像這樣的接口被稱為“functional interface”。通常在Java中,我們經常使用匿名內部類來實現函數式接口,這是一種很常見的使用模式;
另外,在JDK中,除了ActionListener接口外,類似的還有Runnable和Comparator接口。
Lambda表達式的語法形式如下:
parameter -> expression body
主要組成:參數列表 + 箭頭 + 表達式體,如 (int x, int y) -> x + y
其中,表達式體可以是一條表達式,也可以是一個語句塊(多條代碼語句);
Lambda表達式具有如下特征:
舉個例子:
package lambda; /** * LambdaTest * * @author Pi Chen * @version V1.0.0, 2016年9月19日 * @see * @since V1.0.0 */ public class LambdaTest { public static void main(String args[]) { LambdaTest tester = new LambdaTest(); // 有參數類型 MathOperation addition = (int a, int b) -> a + b; // 無參數類型 MathOperation subtraction = (a, b) -> a - b; // 有花括號,有return關鍵字 MathOperation multiplication = (int a, int b) -> { return a * b; }; // 無花括號,無return關鍵字,單一表達式情況 MathOperation division = (int a, int b) -> a / b; // MathOperation調用示例 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); // GreetingService調用示例 greetService1.sayMessage("Mahesh"); greetService2.sayMessage("Suresh"); //有括號, 無參情況 Runnable runTest = () -> System.out.println("Running"); //Runnable調用示例 runTest.run(); } // 內部接口 interface MathOperation { int operation(int a, int b); } interface GreetingService { void sayMessage(String message); } interface Runnable { void run(); } private int operate(int a, int b, MathOperation mathOperation) { return mathOperation.operation(a, b); } }
關鍵點說明:
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/Lambda-QuickStart/index.html#overview
https://www.tutorialspoint.com/java8/java8_lambda_expressions.htm