1. 程式人生 > 其它 >Java8新特性之Lambda表示式

Java8新特性之Lambda表示式

1、Lambda 的基本介紹

Lambda Java8 的新特性之一,Lambda是一個匿名函式,我們可以把Lambda表示式理解為是一段可以傳遞的程式碼(將程式碼像資料一樣進行傳遞)。可以寫出更簡潔、更靈活的程式碼。作為一種更緊湊的程式碼風格,使Java的語言表達能力得到了提升。

在JDK8之前,Java是不支援函數語言程式設計的,所謂的函式程式設計,即可理解是將一個函式(也稱為“行為”)作為一個引數進行傳遞。通常我們提及得更多的是面向物件程式設計,面向物件程式設計是對資料的抽象(各種各樣的POJO類),而函數語言程式設計則是對行為的抽象(將行為作為一個引數進行傳遞)。在JavaScript中這是很常見的一個語法特性,但在Java中將一個函式作為引數傳遞這卻行不通,好在JDK8的出現打破了Java的這一限制。

2、Lambda 的語法

Lambda 表示式在Java 語言中引入了一個新的操作符。這個操作符為 “->” , 該操作符被稱為 Lambda 操作符或剪頭操作符。

Lambda 操作符 -> 將 Lambda 分為了兩個部分:

  • 左側: 指定了 Lambda 表示式需要的所有引數
  • 右側: 指定了 Lambda 體,即 Lambda 表示式要執行的功能。

各種情況語法格式說明:

  • 無入參,無返回值:
Runnable r1 = () -> System.out.println("Hello Lambda!");
  • 有一個入參,無返回值:
Consumer<String> con = (x) -> System.out.println(x);
Consumer
<String> con = x -> System.out.println(x); //只有一個引數,此時引數的小括號可以省略掉
  • 有兩個入參,並且有返回值
Comparator<Integer> com = (x, y) -> {
    System.out.println("函式式介面");
    return Integer.compare(x, y);
};

當Lambda體只有一條語句時,return與大括號都可以省略,Lambda 會自動將操作符右側的值進行返回

Comparator<Integer> com = (x, y) -> Integer.compare(x, y);

Lambda 表示式的引數列表的資料型別也可以省略不寫,因為JVM編譯器會通過上下文自動推斷出資料型別,即“型別推斷”

Comparator<Integer> com = ( Integer x, Integer y) -> {  //Integer 型別可以省略
   System.out.println("函式式介面");
   return Integer.compare(x, y);
};

型別推斷:Lambda 表示式中的引數型別都是由編譯器推斷 得出的。 Lambda 表示式中無需指定型別,程式依然可以編譯,這是因為 javac 根據程式的上下文,在後臺推斷出了引數的型別。 Lambda 表示式的型別依賴於上下文環境,是由編譯器推斷出來的。這就是所謂的 “型別推斷”