lambda表達(dá)式

什么是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á)式的樣子

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):

  1. 無參數(shù)
  2. 單個參數(shù)
  3. 無參數(shù),多行寫法
  4. 兩個參數(shù)
  5. 兩個參數(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ù)接口中我們要注意的就是這單一函數(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ù)接口的圖形表示如下圖:


函數(shù)接口的圖形表示

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

參考

  1. https://programmingmitra.blogspot.com/2016/06/java-lambda-expression-explained-with-example.html
  2. http://shop.oreilly.com/product/0636920030713.do
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容