Lambda表達式是在java規範提案JSR 335中定義的,Java 8 中引入了Lambda表達式,並被認爲是Java 8最大的新特性,Lambda表達式促進了函數式編程,簡化了Java編程開發。html
在Java中,匿名內部類通常適用於那些在Java應用中只會出現一次的實現類,舉個例子,在標準的Swing或JavaFX應用中,有不少鍵盤和鼠標的事件處理程序,通常狀況下,你不須要寫一個單獨的事件處理類,而是使用以下方式(有Swing編程經驗的應該很熟悉吧):java
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接口的實現類,這樣的代碼並不優雅,由於僅僅爲了定義一個方法就須要附加寫一大堆的代碼。一般,哪裏須要,就在哪裏建立對應的匿名內部類,這樣的代碼可讀性會更強。web
首選,咱們來觀察下上面提到的ActionListener接口的定義,以下:express
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接口。oracle
Lambda表達式的語法形式以下:ide
parameter -> expression body
主要組成:參數列表 + 箭頭 + 表達式體,如 (int x, int y) -> x + y函數式編程
其中,表達式體能夠是一條表達式,也能夠是一個語句塊(多條代碼語句);函數
Lambda表達式具備以下特徵:ui
舉個例子:
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