什么是lambda表達(dá)式
lambda表達(dá)式的本質(zhì)
lambda表達(dá)式是一種匿名函數(shù),匿名函數(shù)是函數(shù)定義不綁定到任何標(biāo)識符的函數(shù)。所以lambda表達(dá)式本質(zhì)上是函數(shù),lambda expression, function literal, lambda abstraction 本質(zhì)上都是匿名函數(shù)。
lambda表達(dá)式的樣子

看圖很清楚,主要由三部分組成:函數(shù)簽名、lambda操作符、函數(shù)主體;lambda操作符將函數(shù)簽名和函數(shù)主體分開。
使用lambda表達(dá)式時,看lambda表達(dá)式定義,即接收多少個參數(shù),每個參數(shù)是什么類型;返回多少個參數(shù),每個參數(shù)是什么類型。需要關(guān)注lambda表達(dá)式實現(xiàn)細(xì)節(jié)時,才需要看函數(shù)主體。
lambda表達(dá)式常見形式
Runnable noArguments = () -> System.out.println("Hello World");
ActionListener oneArgument = event -> System.out.println("button clicked");
Runnable multiStatement = () -> {
System.out.print("Hello")
System.out.println(" World")
};
BinaryOperator<Long> add = (x, y) -> x + y;
BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;
上述源碼對應(yīng):
- 無參數(shù)
- 單個參數(shù)
- 無參數(shù),多行寫法
- 兩個參數(shù)
- 兩個參數(shù),顯式說明類型
單看() -> System.out.println("Hello World");是無法得出此lambda表達(dá)式的具體類型的,在不同環(huán)境下,此表達(dá)式的類型也不同;實際上,lambda表達(dá)式的類型依賴于上下文環(huán)境,是由編譯器推斷出來的;所以我們更在意lambda表達(dá)式的目標(biāo)類型——Lambda表達(dá)式所在上下文環(huán)境的類型。
java8如何支持lambda,在哪兒使用
java8仍然是面向?qū)ο笳Z言,在面向?qū)ο笳Z言中,函數(shù)被放在類、抽象類或者接口中,lambda表達(dá)式作為函數(shù)也要放在某個地方,Oracle工程師對Java進(jìn)行微調(diào),引入函數(shù)接口的概念,lambda表達(dá)式就被放在函數(shù)接口中,只有函數(shù)接口存在的地方可以使用lambda表達(dá)式。
函數(shù)接口
只有一個抽象方法的接口被稱為函數(shù)接口,函數(shù)接口可以使用@FuctionalInterface注解,也可以不使用。

函數(shù)接口中我們要注意的就是這單一函數(shù)接口所明確的lambda表達(dá)式的簽名,其它并不重要。當(dāng)使用的Lambda表達(dá)式和函數(shù)接口中函數(shù)類型兼容時,即可使用此Lambda表達(dá)式。在函數(shù)接口中為函數(shù)起一個有意義的名字,可以增加代碼易讀性,便于更透徹地理解參數(shù)的用途。
函數(shù)接口的圖形表示
| 接口 | 參數(shù) | 返回類型 |
|---|---|---|
| Predicate<T> | T | boolean |
| Consumer<T> | T | void |
| Function<T, R> | T | R |
| Supplier<T> | None | T |
| UnaryOperator<T> | T | T |
| BinaryOperator<T> | (T, T) | T |
使用函數(shù)接口的圖形表示可以很明確地知道函數(shù)接口的輸入和輸出,進(jìn)而了解函數(shù)接口的用途。
函數(shù)接口的圖形表示,使用指向函數(shù)的箭頭表示參數(shù),從函數(shù)射出的箭頭表示返回。
| 接口 | 參數(shù) | 返回類型 |
|---|---|---|
| Predicate<T> | T | boolean |
| Consumer<T> | T | void |
| Function<T, R> | T | R |
| Supplier<T> | None | T |
| UnaryOperator<T> | T | T |
| BinaryOperator<T> | (T, T) | T |
上述內(nèi)置函數(shù)接口的圖形表示如下圖:

查看Predicate的圖形表示,知道其輸入是任意的T類型,返回是boolean類型,函數(shù)的作用通過其名字Predicate知道這個函數(shù)是一個斷言函數(shù),對輸入任意一個類型T,斷定其真假,斷定的邏輯就由實現(xiàn)它的函數(shù),或者與其兼容的lamba表達(dá)的主體決定。