1.Lambda表達式
Lambda表達式是Java 8引入的新特性,詳細JSR規範見:JSR-337(9.8 Functional Interfaces/15.13 Method Reference Expressions/15.27 Lambda Expressions)
1.1 Lambda表達式結構:
(參數列表)->{代碼塊}
- 形參列表:a.參數列表可以爲空
- b.如果只要一個參數可以省略括號
- 代碼塊:a.如果代碼塊只有一條語句,可以省略花括號
- b.如果代碼塊有返回值且只有一條語句,可以省略return關鍵詞,返回這一條語句的值作爲返回值!
2.函數式接口
2.1 定義:只聲明一個抽象方法的接口(可以存在多個類方法和默認方法)
2.2 lambda表達式與函數式接口:
lambda表達式的使用依賴與函數式接口,lambda表達式需要賦值給一個函數式接口,並通過函數式接口中的唯一抽象方法調用(抽象方法的入參、返回值必須與lambda表達式一致)!
2.3 @FunctionalInterface註解:
Java 8爲函數式接口提供了專門的註解,該註解沒有任何功能作用,僅僅是告知編譯器該接口爲函數式接口,不滿足函數式接口要求編譯報錯!
代碼示例(包含與內部匿名類的比較):
@FunctionalInterface
interface TestFunction{
int apply(int a);
}
public class Main {
public static void main(String args[]) {
/*Lambda表達式實現*/
TestFunction testCase1 = (int q) -> {
System.out.println("Lambda Test");
return q;
};
System.out.println(testCase1.apply(100));
/*匿名類對比實現*/
TestFunction testCase2 = new TestFunction()
{
public int apply(int a)
{
System.out.println("Lambda Test");
return a;
}
};
System.out.println(testCase2.apply(100));
}
}
3.方法引用與構造器引用
當lambda表達式代碼塊中只有一條語句的時候,可以使用方法引用和構造器引用來進一步簡化,但是個人感覺可能這種寫法相對比較晦澀(這裏面就不具體提供代碼示例了),詳細說明見JSR-337-15.13!
4.Lambda表達式與匿名內部類關係
相同點:
- Lambda表達式是匿名內部類的一種簡化,可以替代部分匿名內部類
- Lambda表達式與匿名內部類一樣,都遵循"effectively final"規則,詳細描述見《JavaSE學習筆記(6.Java的內部類)》
不同點:
Lambda表達式的使用場景,僅僅是生成一個函數式接口實現類的過程;但是匿名內部類的使用場景,是繼承父類(基礎類、抽象類、接口),並生成一個匿名子類的過程!所以匿名內部類的使用場景更多,類內可以實現多個抽象方法,並可以直接訪問接口中的默認方法!Lambda表達式僅僅是匿名內部類的一個使用場景!