函數(shù)式接口在Java中是有且只有一個抽象方法的接口急灭,java中就是使用Lambda接口作為函數(shù)式接口
定義接口格式如上涂邀,其中因為方法默認(rèn)public abstract所以是可以省略的(當(dāng)然接口還可以定義其他默認(rèn)方法,靜態(tài)方法剩失,私有方法勘究,但不能定義多余一個抽象方法)
如上渗鬼,我們定義2個抽象方法勘畔,則其不是函數(shù)接口所灸,只是普通接口,我們可以通過什么來限制抽象方法數(shù)量呢
我們在接口定義前使用@FunctionalInterface炫七,編輯器會自動添加爬立,這樣我們寫2個抽象方法就會標(biāo)紅
刪掉一個后,顯示正常万哪。當(dāng)然@是注解寫法(用于限制結(jié)構(gòu))侠驯,我們之前也遇到重寫方法,@Override壤圃,必須是準(zhǔn)確重寫才不會報錯
Lambda的延遲執(zhí)行
有些場景代碼執(zhí)行后陵霉,其結(jié)果不一定馬上被使用,造成性能浪費伍绳,而lambda表達(dá)式是延遲執(zhí)行,可以提升性能
比如我們定義個log輸出日志函數(shù)乍桂,如果等級是1冲杀,我們就輸出信息效床,我們給log的等級傳入1,二參數(shù)穿入口拼接字符串权谁,當(dāng)然輸出信息剩檀,但是如果傳入其他level值,還是會計算拼接的內(nèi)容旺芽,這顯然沒有必要沪猴,這里就需要使用lambda表達(dá)式的延時功能,使用lambda表達(dá)式采章,則必須有函數(shù)式接口
接口定義如上运嗜,返回拼接字符串,
函數(shù)式接口作為參數(shù)
定義函數(shù)悯舟,傳入接口担租,使用時使用lambda表達(dá)式作為接口參數(shù)
之前多線程里也用過lambda表達(dá)式,這里再鞏固下抵怎,我們知道Runnable可以作為Thread構(gòu)造方法的參數(shù)奋救,而且是函數(shù)式接口,可以重寫run方法反惕,我們于是可以如上2種方法啟動尝艘,1是重寫了,2是因為其符合函數(shù)接口姿染,我們直接使用lambda表達(dá)式
當(dāng)然Lambda方法體只有一行時背亥,{}和分號可以省略
函數(shù)式接口作為返回值
java.util.comparator接口也是函數(shù)式接口,其compare方法盔粹,可以用于排序隘梨,
使用匿名內(nèi)部類返回Comparator接口,然后實現(xiàn)排序
而使用Lambda表達(dá)式就可以優(yōu)化很多舷嗡,因為數(shù)據(jù)類型可以省略還有括號分號等
常用函數(shù)式接口
jdk常用的函數(shù)式接口在Java.util.function包中轴猎,里面都是函數(shù)式接口,而且只有一個抽象方法进萄,我們只挑幾個比較重要的接口來講
Supplier接口
Supplier<T>接口指定泛型捻脖,里面有個T get()方法,參數(shù)無參中鼠,返回的就是這個泛型可婶,這個接口被稱為生產(chǎn)型接口,我們給其指定其什么泛型援雇,其就輸出什么類型
如上矛渴,我們定義函數(shù)參數(shù)為接口,然后使用lambda表達(dá)式重寫接口,效果如上具温,我們給設(shè)置字符串泛型蚕涤,那就返回字符串
Consumer接口
Consumer接口也要指定泛型,抽象方法accept參數(shù)為泛型铣猩,返回值無
如上揖铜,判斷個年齡是否達(dá)到18歲來確認(rèn)成年與否,順帶使用了下三元操作符
Consumer接口還有默認(rèn)方法andThen达皿,用于實現(xiàn)多個消費處理
源碼和介紹如上天吓,其默認(rèn)方法接收Comsumer接口對象,返回的是Consumer接口峦椰,
如上注解龄寞,我們2個接口都對字符串s進(jìn)行消費,顯然可以分著寫们何,當(dāng)然可以使用andThen實現(xiàn)2個消費萄焦,效果一樣,注意冤竹,先調(diào)用的先消費
我們先寫一個2個接口的分別accept
如上拂封,使用andThen,效果一樣
Predicate接口
抽象方法boolean test(T t)用于判斷
還是判斷是否成年鹦蠕,如上即可
Predicate接口還有3個默認(rèn)方法冒签,與或非
and方法
其介紹如上,源碼可以看出是默認(rèn)為短路與钟病,and傳入另一個Predicate或高級接口萧恕,返回2這test的結(jié)果
or方法
本質(zhì)是短路或,將返回Predicate接口
negate方法
是取反
沒什么可說的肠阱,或和非的代碼如上
Function接口
此接口是用于類型轉(zhuǎn)換加工的接口票唆,抽象方法apply,參數(shù)傳入T類型屹徘,返回R類型走趋,接口的泛型需要同時指定T,R
默認(rèn)方法andThen
默認(rèn)方法同樣是實現(xiàn)多個接口的轉(zhuǎn)換,并將結(jié)果返回對應(yīng)處理噪伊,如上簿煌,我們對數(shù)字字符串->int且+3,然后再將其轉(zhuǎn)換為字符串