一、函式式介面是什么?
所謂的函式式介面,實際上就是介面里面只能有一個抽象方法的介面,我們上一節用到的Comparator介面就是一個典型的函式式介面,它只有一個抽象方法compare,

只有一個抽象方法?那上圖中的equals方法不是也沒有函式體么?不急,和我一起往下看!
二、函式式介面的特點
- 介面有且僅有一個抽象方法,如上圖的抽象方法compare
- 允許定義靜態非抽象方法
- 允許定義默認defalut非抽象方法(default方法也是java8才有的,見下文)
- 允許java.lang.Object中的public方法,如上圖的方法equals,
- FunctionInterface注解不是必須的,如果一個介面符合"函式式介面"定義,那么加不加該注解都沒有影響,加上該注解能夠更好地讓編譯器進行檢查,如果撰寫的不是函式式介面,但是加上了@FunctionInterface,那么編譯器會報錯
甚至可以說:函式式介面是專門為lambda運算式準備的,lambda運算式是只實作介面中唯一的抽象方法的匿名實作類,
三、default關鍵字
順便講一下default關鍵字,在java8之前
- 介面是不能有方法的實作,所有方法全都是抽象方法
- 實作介面就必須實作介面里面的所有方法
這就導致一個問題:當一個介面有很多的實作類的時候,修改這個介面就變成了一個非常麻煩的事,需要修改這個介面的所有實作類,
這個問題困擾了java工程師許久,不過在java8中這個問題得到了解決,沒錯就是default方法
- default方法可以有自己的默認實作,即有方法體,
- 介面實作類可以不去實作default方法,并且可以使用default方法,
四、JDK中的函式式介面舉例
java.lang.Runnable,
java.util.Comparator,
java.util.concurrent.Callable
java.util.function包下的介面,如Consumer、Predicate、Supplier等
五、自定義Comparator排序
我們自定義一個排序器,實作compare函式(函式式介面Comparator唯一的抽象方法),回傳0表示元素相等,-1表示前一個元素小于后一個元素,1表示前一個元素大于后一個元素,這個規則和java 8之前沒什么區別,
下面代碼用自定義介面實作類的的方式實作:按照年齡的倒序排序!
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);
最終的列印結果如下,按照年齡的自定義規則進行排序,
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運算式簡寫,箭頭左側是引數,右側是函式體,引數型別和回傳值根據背景關系自動判斷,如下:
employees.sort((em1,em2) -> {
if(em1.getAge() == em2.getAge()){
return 0;
}
return em1.getAge() - em2.getAge() > 0 ? -1:1;
});
employees.forEach(System.out::println);
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客,
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! ,另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注,
- 《手摸手教你學Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《實戰前后端分離RBAC權限管理系統》
- 《實戰SpringCloud微服務從青銅到王者》
- 《VUE深入淺出系列》
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/155277.html
標籤:Java
