雲栖号資訊:【 點選檢視更多行業資訊】
在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!
函數式接口
如果你的好奇心使你翻看Runnable接口源代碼,你會發現該接口被一個@FunctionalInterface的注解修飾,這是 Java 8 中添加的新注解,用于表示 「函數式接口」。

FunctionalInterface-Runnable
函數式接口又是什麼鬼?
在 Java 8 中,把那些僅有一個抽象方法的接口稱為函數式接口。如果一個接口被@FunctionalInterface注解标注,表示這個接口被設計成函數式接口,隻能有一個抽象方法,如果你添加多個抽象方法,編譯時會提示“Multiple non-overriding abstract methods found in interface XXX”之類的錯誤。
标注為 FunctionalInterface 的接口被稱為函數式接口,該接口隻能有一個自定義方法,但是可以包括從 object 類繼承而來的方法。如果一個接口隻有一個方法,則編譯器會認為這就是一個函數式接口。是否是一個函數式接口,需要注意的有以下幾點:
- 該注解隻能标記在”有且僅有一個抽象方法”的接口上。
- JDK8 接口中的靜态方法和預設方法,都不算是抽象方法。
- 接口預設繼承 java.lang.Object,是以如果接口顯示聲明覆寫了 Object 中方法,那麼也不算抽象方法。
- 該注解不是必須的,如果一個接口符合”函數式接口”定義,那麼加不加該注解都沒有影響。加上該注解能夠更好地讓編譯器進行檢查。如果編寫的不是函數式接口,但是加上了@FunctionInterface,那麼編譯器會報錯。
- 在一個接口中定義兩個自定義的方法,就會産生 Invalid ‘@FunctionalInterface’ annotation; FunctionalInterfaceTest is not a functional interface 錯誤。
函數式方法又能做什麼?
Java8 允許你以 Lambda 表達式的方式為函數式接口提供實作,「通俗的說,你可以将整個 Lambda 表達式作為接口的實作類」。
除了Runnable之外,Java 8 中内置了許多函數式接口供開發者使用,這些接口位于java.util.function包中。如:
Functional-Package
如果輸入參數是基本類型,為了避免自動拆箱裝箱,可以使用其他基本類型的函數接口。
Function
interface Function 接口包含一個apply方法、兩個預設方法(compose、andThen)和一個靜态方法identity。apply是接口的基本方法。compose、andThen是一對兒方法,他們的差別在于執行的順序不同。
Consumer
interface Consumer 接口包含一個void accept(T t);方法、預設方法andThen.
隻有一個預設方法也是和它的傳回類型有關系,因為傳回的是 void。
Predicate
interface Predicate接口包含一個boolean test(T t);方法,三個預設方法(and,negate,or),還有一個靜态方法。我們也知道Predicate 接口是傳回 boolean 類型的,是以一看就知道是條件判斷的。舉幾個栗子吧:
Supplier
Supplier隻有一個 get()方法。我們來看看幾個栗子:
總結
函數式接口其實差别不大,隻是參數和傳回的不同,隻要想明白其中的一種,其他的也就懂了。
【雲栖号線上課堂】每天都有産品技術專家分享!
課程位址:
https://yqh.aliyun.com/live立即加入社群,與專家面對面,及時了解課程最新動态!
【雲栖号線上課堂 社群】
https://c.tb.cn/F3.Z8gvnK
原文釋出時間:2020-05-07
本文作者:何小H
本文來自:“
掘金”,了解相關資訊可以關注“掘金”