Function接口:
上次中已經使用了Function的apply()方法,但是在這個接口中還存在三個具體實現的方法,如下:
下面來仔細的將剩下的方法學習一下:
compose():
首先來讀一下該方法的javadoc的描述:
一路讀下來貌似還是有點懵,感覺好繞,下面再來看一下它的具體實現,這樣可以就容易理解一些:
說白了,這個方法就是可以組合多個Function,由於該函數最終還是返回的Function,也就是說可以不斷的進行多次的compose,了解了方法的說明之后,下面用代碼來使用一下它:
先根據咱們讀文檔上的描述來分析一下:
所以,該程序的結果輸出應該是12,下面編譯運行一下:
如我們所預期~
andThen():
理解了compose()方法,對於這個方法來說就比較容易理解了,跟compose()恰恰相反,也就是先執行當前函數,然后再執行andThen()方法傳參的函數,下面也來讀一下它的javaDoc:
下面再來看一下它的具體實現:
下面再來用代碼來使用下,其實是比較好理解的:
在運行之前,咱們也來先分析一下結果:
編譯運行:
identity():
對於這個接口非常簡單,看一下javadoc:
所以這里就不演示了。
BiFuction接口:
對於Function函數式接口而言,只有一個輸入參數,那如果想傳兩個參數呢?這時就可以用BiFunction接口啦,其中的Bi是Bidirectional【雙向】的簡寫,下面看一下它的javadoc:
那怎么使用它呢?試想一下傳統方式要實現兩數的四則運算會如何去寫呢?定義好加減乘除方法,然后分別去調用既可,偽碼如下:
那試想一下,是不是對於兩數四則運算的場景剛好滿足BiFunction的特性,傳遞兩個參數,最后返回一個值,只是說可能具體的行為需要調用者來傳遞,這不正好是使用Lambda表達式的用途所在么?所以下面用新的寫法來實現兩數的四則運算:
編譯運行:
再一次體現出Lambda表達式傳遞的是行為,而非值。
另外再來看一下它有默認方法相比Function接口而言有啥區別:
關於為什么在BiFunction中少了compose()方法,這個在之后會進行說明,先看一下具體實現:
由於該方法的javadoc跟Function的andThen說明一樣,所以就不細讀了,下面直接應用一下:
同樣的在運行之前先來分析一下結果:
編譯運行:
思考:
①、BiFunction相比Function為啥沒有compose()方法,而只有andThen()方法呢?
這里用一個假設法來進行解釋,假設BiFunction中有compose()方法,根據Function的compose()方法來看,很明顯是需要先執行before函數的,如下:
當然截圖的這是Function.compose()方法原型,要是BiFunction也有compose()方法的話,那這個before參數應該也是BiFunction類型的,但是無所謂,問題的重點是:這兩個函數最終執行只能返回一個結果,因為一個方法只能有一個返回值,而執行完before函數之后,接着就要應用到當前的函數上了,還是以Function原型舉例:
而咱們討論的是BiFunction,那應用它時是需要兩個輸入參數的,但是before執行完之后只得到了一個結果,那不互相矛盾了么?所以這就是為啥在BiFunction中木有提供compose()方法的原因啦。
②、 為啥BiFunction的andThen()方法不是BiFunction類型,而是Function類型呢?
這個問題在前面也已經拋出來了,其實如果理解了第一個思考問題那對於這個問題比較容易理解,為啥呢?看下具體實現:
而接着要將這個唯一的返回值要應用到after參數上,因為只有一個參數,所以也只能是用Function,剛好符合Function只有一個參數的語法要求,不可能是用BiFunction。