函數(shù)式接口(Functional Interface)就是一個(gè)有且僅有一個(gè)抽象方法,但是可以有多個(gè)非抽象方法的接口晰奖。根據(jù)以前版本中的定義:接口中所有的方法必須是抽象方法,這里又來了一個(gè)非抽象方法,那這非抽象方法指的是什么方法呢抹镊?那就是默認(rèn)方法
定義了一個(gè)函數(shù)式接口如下:
@FunctionalInterface
interface GreetingService {?
?????void sayMessage(String message);
}
那么就可以使用Lambda表達(dá)式來表示該接口的一個(gè)實(shí)現(xiàn)(注:JAVA 8 之前一般是用匿名類實(shí)現(xiàn)的):
GreetingService greetService1 = message -> System.out.println("Hello " + message);
在我看來娘香,函數(shù)式接口就是給lambda表達(dá)式私人訂制的苍狰,為了突出lambda的好用办龄,然后來這么一個(gè)特性
java.util.function 它包含了很多類,用來支持 Java的 函數(shù)式編程淋昭。
Java 8為函數(shù)式接口引入了一個(gè)新注解@FunctionalInterface俐填,主要用于編譯級(jí)錯(cuò)誤檢查,加上該注解翔忽,當(dāng)你寫的接口不符合函數(shù)式接口定義的時(shí)候英融,編譯器會(huì)報(bào)錯(cuò)。
提醒:加不加?@FunctionalInterface?對(duì)于接口是不是函數(shù)式接口沒有影響歇式,該注解只是提醒編譯器去檢查該接口是否僅包含一個(gè)抽象方法
函數(shù)式接口里允許定義默認(rèn)方法
函數(shù)式接口里是可以包含默認(rèn)方法驶悟,因?yàn)槟J(rèn)方法不是抽象方法,其有一個(gè)默認(rèn)實(shí)現(xiàn)材失,所以是符合函數(shù)式接口的定義的痕鳍;
函數(shù)式接口里允許定義靜態(tài)方法
函數(shù)式接口里是可以包含靜態(tài)方法,因?yàn)殪o態(tài)方法不能是抽象方法龙巨,是一個(gè)已經(jīng)實(shí)現(xiàn)了的方法笼呆,所以是符合函數(shù)式接口的定義的;
函數(shù)式接口里允許定義 java.lang.Object 里的 public 方法
函數(shù)式接口里是可以包含Object里的public方法恭应,這些方法對(duì)于函數(shù)式接口來說抄邀,不被當(dāng)成是抽象方法(雖然它們是抽象方法);因?yàn)槿魏我粋€(gè)函數(shù)式接口的實(shí)現(xiàn)昼榛,默認(rèn)都繼承了 Object 類境肾,包含了來自 java.lang.Object 里對(duì)這些抽象方法的實(shí)現(xiàn);