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