java理論基礎(chǔ)函數(shù)式接口特點(diǎn)示例解析
一、函數(shù)式接口是什么?
所謂的函數(shù)式接口,實(shí)際上就是接口里面只能有一個(gè)抽象方法的接口。我們上一節(jié)用到的Comparator接口就是一個(gè)典型的函數(shù)式接口,它只有一個(gè)抽象方法compare。

只有一個(gè)抽象方法?那上圖中的equals方法不是也沒(méi)有函數(shù)體么?不急,和我一起往下看!
二、函數(shù)式接口的特點(diǎn)
接口有且僅有一個(gè)抽象方法,如上圖的抽象方法compare
允許定義靜態(tài)非抽象方法
允許定義默認(rèn)defalut非抽象方法(default方法也是java8才有的,見(jiàn)下文)
允許java.lang.Object中的public方法,如上圖的方法equals。
FunctionInterface注解不是必須的,如果一個(gè)接口符合"函數(shù)式接口"定義,那么加不加該注解都沒(méi)有影響。加上該注解能夠更好地讓編譯器進(jìn)行檢查。如果編寫(xiě)的不是函數(shù)式接口,但是加上了@FunctionInterface,那么編譯器會(huì)報(bào)錯(cuò)
甚至可以說(shuō):函數(shù)式接口是專(zhuān)門(mén)為lambda表達(dá)式準(zhǔn)備的,lambda表達(dá)式是只實(shí)現(xiàn)接口中唯一的抽象方法的匿名實(shí)現(xiàn)類(lèi)。
三、default關(guān)鍵字
順便講一下default關(guān)鍵字,在java8之前
接口是不能有方法的實(shí)現(xiàn),所有方法全都是抽象方法
實(shí)現(xiàn)接口就必須實(shí)現(xiàn)接口里面的所有方法
這就導(dǎo)致一個(gè)問(wèn)題:當(dāng)一個(gè)接口有很多的實(shí)現(xiàn)類(lèi)的時(shí)候,修改這個(gè)接口就變成了一個(gè)非常麻煩的事,需要修改這個(gè)接口的所有實(shí)現(xiàn)類(lèi)。
這個(gè)問(wèn)題困擾了java工程師許久,不過(guò)在java8中這個(gè)問(wèn)題得到了解決,沒(méi)錯(cuò)就是default方法
- default方法可以有自己的默認(rèn)實(shí)現(xiàn),即有方法體。
- 接口實(shí)現(xiàn)類(lèi)可以不去實(shí)現(xiàn)default方法,并且可以使用default方法。
四、JDK中的函數(shù)式接口舉例
java.lang.Runnable,
java.util.Comparator,
java.util.concurrent.Callable
java.util.function包下的接口,如Consumer、Predicate、Supplier等
五、自定義Comparator排序
我們自定義一個(gè)排序器,實(shí)現(xiàn)compare函數(shù)(函數(shù)式接口Comparator唯一的抽象方法)。返回0表示元素相等,-1表示前一個(gè)元素小于后一個(gè)元素,1表示前一個(gè)元素大于后一個(gè)元素。這個(gè)規(guī)則和java 8之前沒(méi)什么區(qū)別。
下面代碼用自定義接口實(shí)現(xiàn)類(lèi)的的方式實(shí)現(xiàn):按照年齡的倒序排序!
employees.sort(new Comparator<Employee>() {
@Override
public int compare(Employee em1, Employee em2) {
if(em1.getAge() == em2.getAge()){
return 0;
}
return em1.getAge() - em2.getAge() > 0 ? -1:1;
}
});
employees.forEach(System.out::println);最終的打印結(jié)果如下,按照年齡的自定義規(guī)則進(jìn)行排序。
Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin) Employee(id=7, age=68, gender=F, firstName=Melissa, lastName=Roy) Employee(id=10, age=45, gender=M, firstName=Naveen, lastName=Jain) Employee(id=3, age=43, gender=M, firstName=Ricky, lastName=Martin) Employee(id=4, age=26, gender=M, firstName=Jon, lastName=Lowman) Employee(id=1, age=23, gender=M, firstName=Rick, lastName=Beethovan) Employee(id=5, age=19, gender=F, firstName=Cristine, lastName=Maria) Employee(id=9, age=15, gender=F, firstName=Neetu, lastName=Singh) Employee(id=6, age=15, gender=M, firstName=David, lastName=Feezor) Employee(id=2, age=13, gender=F, firstName=Martina, lastName=Hengis)
這段代碼如果以lambda表達(dá)式簡(jiǎn)寫(xiě)。箭頭左側(cè)是參數(shù),右側(cè)是函數(shù)體,參數(shù)類(lèi)型和返回值根據(jù)上下文自動(dòng)判斷。如下:
employees.sort((em1,em2) -> {
if(em1.getAge() == em2.getAge()){
return 0;
}
return em1.getAge() - em2.getAge() > 0 ? -1:1;
});
employees.forEach(System.out::println);以上就是java理論基礎(chǔ)函數(shù)式接口特點(diǎn)示例解析的詳細(xì)內(nèi)容,更多關(guān)于java理論基礎(chǔ)函數(shù)式接口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中JDBC連接池的基本原理及實(shí)現(xiàn)方式
本文詳細(xì)講解了Java中JDBC連接池的基本原理及實(shí)現(xiàn)方式,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
java時(shí)間 java.util.Calendar深入分析
這篇文章主要介紹了java時(shí)間 java.util.Calendar深入分析的相關(guān)資料,需要的朋友可以參考下2017-02-02
Java Predicate及Consumer接口函數(shù)代碼實(shí)現(xiàn)解析
這篇文章主要介紹了Java Predicate及Consumer接口函數(shù)代碼實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
基于java SSM springboot實(shí)現(xiàn)抗疫物質(zhì)信息管理系統(tǒng)
這篇文章主要介紹了基于JAVA SSM springboot實(shí)現(xiàn)的抗疫物質(zhì)信息管理系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
Java訂單30分鐘未支付自動(dòng)取消該怎么實(shí)現(xiàn)
在開(kāi)發(fā)中往往會(huì)遇到一些關(guān)于延時(shí)任務(wù)的需求,例如生成訂單30分鐘未支付,則自動(dòng)取消,下面這篇文章主要給大家介紹了關(guān)于Java訂單30分鐘未支付自動(dòng)取消該怎么實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2023-03-03
詳解Http請(qǐng)求中Content-Type講解以及在Spring MVC中的應(yīng)用
這篇文章主要介紹了Http請(qǐng)求中Content-Type講解以及在Spring MVC中的應(yīng)用的相關(guān)資料,需要的朋友可以參考下2017-02-02

