java8學習之Supplier與函數式接口總結


Supplier接口:

繼續學習一個新的函數式接口--Supplier,它的中文意思為供應商、提供者,下面看一下它的javadoc:

而具體的方法也是相當的簡單,就是不接受任何參數,返回一個結果:

對它有了大概的了解之后,下面用代碼來使用一下它:

貌似這函數的使用相當簡單呀,但是簡單並非是它的用處少,那它到底可以應用在現實中的什么場合之下呢?工廠就是其一,因為工廠有時里面是不接收參數的,直接從工廠里面返回一個結果,當然如果工廠里面要接收參數且返回結果那Function函數式接口就可以派上用場了,下面還是看一下這種Supplier的場景:

首先定義一個實體:

接着生成Student對象,然后再拿對象的屬性,通常的做法如下:

當然這不是我們想要去做的,而是想通過Supplire函數式接口來生成Student對象並去拿屬性,具體怎么做呢?

當然上面的代碼還可以更加精簡,可以采用構造方法引用【關於方法引用這個到時會仔細學習的,先有個印象既可】來修改:

那為啥"Student::new"就能返回Supplier的實例呢?因為Student的構造方法是不接收參數但是返回Student對象,這不就正好符合Supplier的約定么?下面看一個細節:

上面的效果要歸功於IDE的智能,在點擊new時自動就跳到了Student的定義,而點"::"時跳到了Supplier的定義。也進一步說明這個方法引用方式可以生成Supplier接口的實例,目前Student類中只有一個默認的構造方法,那如果再加一個非默認的構造方法會有什么情況發生呢?

發現咱們的程序依然可以正常運行,這還得歸功於編譯器的智能,怎么個智能法呢?

所以就會到Student類中找一個不帶參數的但是能返回Student的構造方法,發現不就是默認的構造方法么,如果咱們將默認構造方法注釋掉,看有啥反應:

立馬就報錯了,說明確實如咱們所分析的那樣。

當學習到這,基本上就已經將Java8所涉及的重要的函數式接口就已經學習得差不多了,通過合理的搭配這些不同的函數式接口可以幫助我們完成現實中的很多很多的事情。

BinaryOperator接口:

在函數式接口的學習暫且告一段落之前,最后再來學一個新的函數式接口擴展一下,其實也不是完全的新函數,而是繼承咱們之前學習的BiFunction來實現的一個特例,下面看下javadoc對它的描述:

從這句話的描述其實就能感知到:對於BinaryOperator是接受兩個參數,而這兩個參數的類型是一樣的,其返回結果也是跟參數是相同的類型。

但是在BinaryOperator這個接口中貌似也木有找到這個方法呀:

很顯然這個方法是從BiFunction繼承過來滴,另外再看一下它的泛型聲明:

那這個接口存在有啥價值么?還記得之前用BiFunction對兩個整數進行了四則運算如下:

但是~~有木有發現兩整數四則運算之后的結果是不是也是整數類型,那不正符合BinaryOperator函數式接口的特性么,有了它可以讓代碼編寫更加簡潔,下面具體看一下:

比較容易理解,對於這個接口它還有兩個靜態的方法,下面也來看一下:

看下它的具體實現:

等於是生成一個返回兩個數中較少的一個函數式接口,有了它之后再去應用到兩數上,並且咱們指定一個比較器之后就可以按咱們自己的規則來返回兩數中較小的那個數字啦,下面看下如何來應用它,這里以從兩個字串中找出最小的為例:

接下來調用一下:

那接下來更改一下比較規則:字符串首字母的ASCII排前面的則為較小的,如“h”在ASCII表中是排在"w"之前的,所以應該返回"hello123"啦,如下:

 對於它的另一個靜態方法maxBy就完全不用讀就能懂啦,如下:

下面直接應用將其改為maxBy,可想而知其返回就剛好相反啦:

函數式接口總結:

至此,Java8函數式接口的學習就告一段落了,其函數式接口傳遞的是行為這個一定得要好好體會,對於Java8中的函數式接口全部位於java.util.function這個包中:

展開包看一下所有的函數式接口:

BiConsumer
BiFunction
BinaryOperator
BiPredicate
BooleanSupplier
Consumer
DoubleBinaryOperator
DoubleConsumer
DoubleFunction
DoublePredicate
DoubleSupplier
DoubleToIntFunction
DoubleToLongFunction
DoubleUnaryOperator
Function
IntBinaryOperator
IntConsumer
IntFunction
IntPredicate
IntSupplier
IntToDoubleFunction
IntToLongFunction
IntUnaryOperator
LongBinaryOperator
LongConsumer
LongFunction
LongPredicate
LongSupplier
LongToDoubleFunction
LongToIntFunction
LongUnaryOperator
ObjDoubleConsumer
ObjIntConsumer
ObjLongConsumer
Predicate
Supplier
ToDoubleBiFunction
ToDoubleFunction
ToIntBiFunction
ToIntFunction
ToLongBiFunction
ToLongFunction
UnaryOperator

其中標紅的為咱們已經學習過的,那還有這么多木有學習呀,那怎么辦~其實咱們學的是非常之核心的函數式接口,其它木有學習到的函數式接口都是可以觸類旁通的,不信下面舉幾個未學習過的,一看就懂:

Consumer咱們已經學習過了,但是BiConsumer木有學習,但是沒關系,可以從Consumer的用法推導出BiConSumer,先回憶下Comsumer:

根據Function跟BiFunction的規則,那BiConsumer很顯然就是有兩個輸入參數無返回值嘛,如下:

它的使用還用學么,依葫蘆畫瓢~

同樣的我們上次剛學習了Predicate,回憶下:

那BiPredicate呢?還需要動腦去學習它的使用方法么?

下面再看:

這么多,其實也就是換了個數據類型而已,拿其中的一個舉例:

其它的類型就以此類推,基本上是看一眼就能知道怎么使用,再往下看看:

也拿其中的一個舉例:

所以說只學扎實了幾個重要的函數式接口就能將所有Java8的函數式接口都學通,當然之后還會大量的對函數式接口進行使用,在未來學習Stream的時候其實就是對Lambda表達式的一個徹底的使用,函數式接口的學習就先到此,下次繼續深入Java8其它的一些東東~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM