什麼是Lambda?(java)

什麼是Lambda?

咱們知道,對於一個Java變量,咱們能夠賦給其一個「值」函數

若是你想把「一塊代碼」賦給一個Java變量,應該怎麼作呢?ui

好比,我想把右邊那塊代碼,賦給一個叫作aBlockOfCode的Java變量:cdn

在Java 8以前,這個是作不到的。可是Java 8問世以後,利用Lambda特性,就能夠作到了。blog

固然,這個並非一個很簡潔的寫法。因此,爲了使這個賦值操做更加elegant, 咱們能夠移除一些沒用的聲明。接口

這樣,咱們就成功的很是優雅的把「一塊代碼」賦給了一個變量。而「這塊代碼」,或者說「這個被賦給一個變量的函數」,就是一個Lambda表達式get

可是這裏仍然有一個問題,就是變量aBlockOfCode的類型應該是什麼?it

在Java 8裏面,全部的Lambda的類型都是一個接口,而Lambda表達式自己,也就是」那段代碼「,須要是這個接口的實現。這是我認爲理解Lambda的一個關鍵所在,簡而言之就是,Lambda表達式自己就是一個接口的實現。直接這樣說可能仍是有點讓人困擾,咱們繼續看看例子。咱們給上面的aBlockOfCode加上一個類型:io

這種只有一個接口函數須要被實現的接口類型,咱們叫它」函數式接口「。爲了不後來的人在這個接口中增長接口函數致使其有多個接口函數須要被實現,變成"非函數接口」,咱們能夠在這個上面加上一個聲明@FunctionalInterface, 這樣別人就沒法在裏面添加新的接口函數了:ast

這樣,咱們就獲得了一個完整的Lambda表達式聲明:class

Lambda表達式有什麼做用?

最直觀的做用就是使得代碼變得異常簡潔。

咱們能夠對比一下Lambda表達式和傳統的Java對同一個接口的實現:

這兩種寫法本質上是等價的。可是顯然,Java 8中的寫法更加優雅簡潔。而且,因爲Lambda能夠直接賦值給一個變量,咱們就能夠直接把Lambda做爲參數傳給函數, 而傳統的Java必須有明確的接口實現的定義,初始化才行:

有些狀況下,這個接口實現只須要用到一次。傳統的Java 7必需要求你定義一個「污染環境」的接口實現MyInterfaceImpl,而相較之下Java 8的Lambda, 就顯得乾淨不少。

Lambda結合FunctionalInterface Lib, forEach, stream(),method reference等新特性可使代碼變的更加簡潔!

假設Person的定義和List<Person>的值都給定。

如今須要你打印出guiltyPersons List裏面全部LastName以"Z"開頭的人的FirstName。

原生態Lambda寫法:定義兩個函數式接口,定義一個靜態函數,調用靜態函數並給參數賦值Lambda表達式。

www.zhihu.com/question/20…

相關文章
相關標籤/搜索