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 種主要型別。
- “函式”:從數學意義上講的真實函式,正好接收一個輸入並提供一個輸出;
- “消費者”:接受輸入但不提供任何輸出(按傳統意義)的實體;以及
- “供應商”:每次被呼叫時都會提供一個值,而無需任何輸入的實體。
| 介面 | 輸入 | 結果 | 簽名 | |
|---|---|---|---|---|
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)。 |
- 流/集合
- 函式式介面
- 方法引用