函數(shù)式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。根據(jù)以前版本中的定義:接口中所有的方法必須是抽象方法,這里又來了一個非抽象方法,那這非抽象方法指的是什么方法呢?那就是默認(rèn)方法
定義了一個函數(shù)式接口如下:
@FunctionalInterface
interface GreetingService {?
?????void sayMessage(String message);
}
那么就可以使用Lambda表達(dá)式來表示該接口的一個實現(xiàn)(注:JAVA 8 之前一般是用匿名類實現(xiàn)的):
GreetingService greetService1 = message -> System.out.println("Hello " + message);
在我看來,函數(shù)式接口就是給lambda表達(dá)式私人訂制的,為了突出lambda的好用,然后來這么一個特性
java.util.function 它包含了很多類,用來支持 Java的 函數(shù)式編程。
Java 8為函數(shù)式接口引入了一個新注解@FunctionalInterface,主要用于編譯級錯誤檢查,加上該注解,當(dāng)你寫的接口不符合函數(shù)式接口定義的時候,編譯器會報錯。
提醒:加不加?@FunctionalInterface?對于接口是不是函數(shù)式接口沒有影響,該注解只是提醒編譯器去檢查該接口是否僅包含一個抽象方法
函數(shù)式接口里允許定義默認(rèn)方法
函數(shù)式接口里是可以包含默認(rèn)方法,因為默認(rèn)方法不是抽象方法,其有一個默認(rèn)實現(xiàn),所以是符合函數(shù)式接口的定義的;
函數(shù)式接口里允許定義靜態(tài)方法
函數(shù)式接口里是可以包含靜態(tài)方法,因為靜態(tài)方法不能是抽象方法,是一個已經(jīng)實現(xiàn)了的方法,所以是符合函數(shù)式接口的定義的;
函數(shù)式接口里允許定義 java.lang.Object 里的 public 方法
函數(shù)式接口里是可以包含Object里的public方法,這些方法對于函數(shù)式接口來說,不被當(dāng)成是抽象方法(雖然它們是抽象方法);因為任何一個函數(shù)式接口的實現(xiàn),默認(rèn)都繼承了 Object 類,包含了來自 java.lang.Object 里對這些抽象方法的實現(xiàn);