函數(shù)式接口是 Java8 引入的一個(gè)新特性,是一種特殊的接口:SAM類型的接口(Single Abstract Method),但本質(zhì)上還是接口。相比較于其他接口,函數(shù)式接口有且只能有一個(gè)抽象方法。只要接口中出現(xiàn)多個(gè)抽象方法,那么就不能稱之為函數(shù)式接口,運(yùn)行的時(shí)候就會(huì)報(bào)錯(cuò)。為此 Java8 提供了一個(gè)新的注解@FunctionalInterface,如果接口被這個(gè)注解標(biāo)注,就說明該接口是函數(shù)式接口,如果有多于一個(gè)的抽象方法,在編譯的時(shí)候就會(huì)報(bào)錯(cuò)。但是這個(gè)注解不是必需的,只要接口符合函數(shù)式接口的定義,那么這個(gè)接口就是函數(shù)式接口。
原則上講,函數(shù)式接口中有且只能有一個(gè)抽象方法。但是在 Java8 之后接口中也是可以定義方法的:默認(rèn)方法和靜態(tài)方法,這兩種方法的定義并不會(huì)影響函數(shù)式接口的定義,可以隨意使用。即:
- 接口中可以有一個(gè)或多個(gè)靜態(tài)方法,這不會(huì)影響到函數(shù)式接口的定義
- 在 Java8 之后,接口允許定義由 default 修飾的默認(rèn)方法。這些方法也不會(huì)影響到函數(shù)式接口的定義
- 可以有頂級(jí)父類
Object中 public 類型 的覆蓋方法。比如覆蓋父類中的:equals,toString,hashcode等方法 - 函數(shù)式接口也支持繼承,可以繼承多個(gè)父接口,但是每個(gè)父接口只能有一個(gè)抽象方法,且必須是相同的抽象方法。
函數(shù)式接口的使用,使的我們可以將方法當(dāng)作參數(shù)來傳遞。在調(diào)用時(shí),lambda 表達(dá)式作為參數(shù)來使用。換句話說,當(dāng)一個(gè)方法的參數(shù)是 lambda 表達(dá)式時(shí),這個(gè)參數(shù)類型一定是函數(shù)式接口.
下面是一個(gè)函數(shù)接口的例子:
@FunctionalInterface
public interface LambdaTestasd {
static void out(){
System.out.println("這是一個(gè)函數(shù)式接口");
System.out.println("這是接口里的靜態(tài)方法");
}
default void print(){
System.out.println("這是接口里的默認(rèn)方法");
}
void test();
}
在 java8 中的 java.util.function包中,包含了幾大類函數(shù)式接口聲明:


其他的一些函數(shù)式接口:
