跳轉到內容

Java 程式設計/Lambda 表示式

來自華夏公益教科書,開放的書籍,開放的世界

Lambda 表示式是在 Java 8 中引入的,作為一種簡潔的方式來描述功能,作為語言中的一級成員。雖然原理類似於使用匿名內部類來滿足介面,但 lambda 表示式使程式碼更易讀。

即,而不是

Collection<Book> results = library.findAll(new Predicate() {
   @Override
   public boolean test(Book book) {
       return book.getTitle().contains("Java");
   }
});

我們可以簡單地說

Collection<Book> results = library.findAll(book -> book.getTitle().contains("Java"));

Lambda 表示式由兩個部分組成,這兩個部分由 -> 字元(稱為“箭頭”)隔開。

Parameters -> Body

引數定義表示式的輸入。通常,引數是由括號括起來的、由逗號分隔的型別和識別符號列表。

( Type1 identifier1 , Type2 identifier2 ) -> Body

但是,型別通常可以從上下文推斷出來,可以省略。

( identifier1, identifier2 ) -> Body

並且,如果只有一個輸入且其型別可以推斷出來,則可以省略括號。

identifier1 -> Body

Lambda 表示式的主體描述了應該對這些輸入(如果有)執行的操作。通常,主體就像任何其他塊一樣。

Parameters -> {
    statements;
    ...
    return statement;
}

對於只對輸入進行操作的表示式,可以省略 return 語句。

Parameters -> {
    statements;
    ...
}

如果主體只包含一條語句,則可以省略花括號和結尾分號。

Parameters -> statement

如果表示式包含單個 return 語句,則可以省略花括號、return 關鍵字和結尾分號。

Parameters -> result

java.util.function 名稱空間包含許多現成的結構,介紹了一些標準術語,這些術語屬於 3 種主要型別。

  1. “函式”:從數學意義上講的真實函式,正好接收一個輸入並提供一個輸出;
  2. “消費者”:接受輸入但不提供任何輸出(按傳統意義)的實體;以及
  3. “供應商”:每次被呼叫時都會提供一個值,而無需任何輸入的實體。
介面 輸入 結果 簽名
Function<T, R> T R T -> R 接受型別為 T 的一個輸入並返回型別為 R 的東西。
Consumer<T> T T -> 接受型別為 T 的一個輸入,不返回任何東西(void)。
Supplier<R> R -> R 不接受任何輸入,並返回型別為 R 的物件。

Function 和 Consumer 也具有接受兩個輸入的“Bi”變體。

介面 輸入 結果 簽名
BiFunction<S, T, R> S, T R (S, T) -> R 接受兩個輸入,一個型別為 S,另一個型別為 T,並返回型別為 R 的東西。
BiConsumer<S, T> S, T (S, T) -> 接受兩個輸入,一個型別為 S,另一個型別為 T,不返回任何東西(void)。

進一步閱讀

[編輯 | 編輯原始碼]
  • 流/集合
  • 函式式介面
  • 方法引用
華夏公益教科書