JAVA | Lambda表達式快速學習

什麼是Lambda表達式

Lambda 表達式,也可稱爲閉包,它是推動 Java 8 發佈的最重要新特性。

Lambda 是一個匿名函數,可以把 Lambda 表達式理解爲是一段可以傳遞的代碼(將代碼像數據一樣進行傳遞)。可以寫出更簡潔、更靈活的代碼。作爲一種更緊湊的代碼風格,使 Java的語言表達能力得到了提升。

lambda 表達式的語法格式如下:

(parameters) -> expression
或者
(parameters) ->{ statements; }

以下是lambda表達式的重要特徵:

可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。
可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。

Lambda 表達式的簡單例子:

// 1. 不需要參數,返回值爲 5  
() -> 5  
  
// 2. 接收一個參數(數字類型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2個參數(數字),並返回他們的差值  
(x, y) -> x – y  
  
// 4. 接收2個int型整數,返回他們的和  
(int x, int y) -> x + y  
  
// 5. 接受一個 string 對象,並在控制檯打印,不返回任何值(看起來像是返回void)  
(String s) -> System.out.print(s)

Lambda表達式語法

Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
Runnable runnable = () -> System.out.println("Lambda表達式");

Lambda 表達式在Java 語言中引入了一個新的語法元 素和操作符。這個操作符爲 “->” , 該操作符被稱爲 Lambda 操作符或剪頭操作符。它將 Lambda 分爲 兩個部分:
左側:指定了 Lambda 表達式需要的所有參數
右側:指定了 Lambda 體,即 Lambda 表達式要執行的功能。

lambda表達式語法可抽象表示爲:

(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
     statment1;
     statment2;
     ...
     return statmentN;
}

以Predicate判斷是否爲成年人爲例:

Predicate<Person> predicate = (Person person) -> {
    Integer age = person.getAge();
    return age >= 18;
};

上面的lambda表達式語法抽象表示是比較官方的,和我們平時所寫的lambda表達式比起來要繁瑣一些。彆着急,下面會一點一點地演示lambda表達式的簡化過程。

  1. 參數類型省略
    絕大多數情況,編譯器都可以從上下文環境中推斷出lambda表達式的參數類型。這樣,lambda表達式就變成了:
(param1, param2, ..., paramN) -> {
    statment1;
    statment2;
    ...
    return statmentN;
}

上面的例子也可簡化爲:

Predicate<Person> predicate = (person) -> {
    Integer age = person.getAge();
    return age >= 18;
};
  1. 當lambda表達式的參數個數只有一個,可以省略小括號。
    lambda表達式簡寫爲:
param -> {
    statment1;
    statment2;
    ...
    return statmentN;
}

對應的例子簡化爲:

Predicate<Person> predicate = person -> {
    Integer age = person.getAge();
    return age >= 18;
};
  1. 當lambda表達式只包含一條語句時,可以省略大括號、return和語句結尾的分號。

    其他省就省了,爲啥return關鍵字也可以被省略呢?原因是,編譯器會認爲:既然只有一個語句,那麼這個語句執行的結果就應該是返回值,所以return也就不需要了。因此,lambda表達式簡化爲:

param -> statment;

所以例子又可簡化成:

Predicate<Person> predicate = person -> person.getAge() >= 18
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章