JavaSE學習筆記(7.Lamda表達式)

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表達式與匿名內部類關係

相同點:

  1. Lambda表達式是匿名內部類的一種簡化,可以替代部分匿名內部類
  2. Lambda表達式與匿名內部類一樣,都遵循"effectively final"規則,詳細描述見《JavaSE學習筆記(6.Java的內部類)》

不同點:

Lambda表達式的使用場景,僅僅是生成一個函數式接口實現類的過程;但是匿名內部類的使用場景,是繼承父類(基礎類、抽象類、接口),並生成一個匿名子類的過程!所以匿名內部類的使用場景更多,類內可以實現多個抽象方法,並可以直接訪問接口中的默認方法!Lambda表達式僅僅是匿名內部類的一個使用場景!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章