概念
函數式接口在Java中是指:有且僅有一個抽象方法的接口。
函數式接口,即適用於函數式編程場景的接口。而Java中的函數式編程體現就是Lambda,所以函數式接口就是可
以適用於Lambda使用的接口。只有確保接口中有且僅有一個抽象方法,Java中的Lambda才能順利地進行推導。
備注:“語法糖”是指使用更加方便,但是原理不變的代碼語法。例如在遍歷集合時使用的for-each語法,其實 底層的實現原理仍然是迭代器,這便是“語法糖”。從應用層面來講,Java中的Lambda可以被當做是匿名內部 類的“語法糖”,但是二者在原理上是不同的。
格式
只要確保接口中有且僅有一個抽象方法即可:
修飾符 interface 接口名稱 {
public abstract 返回值類型 方法名稱(可選參數信息);
// 其他非抽象方法內容
......
}
由於接口當中抽象方法的 public abstract 是可以省略的,所以定義一個函數式接口很簡單:
修飾符 interface 接口名稱 {
返回值類型 方法名稱(可選參數信息);
}
@FunctionalInterface注解
與 @Override 注解的作用類似,Java 8中專門為函數式接口引入了一個新的注解: @FunctionalInterface 。該注
解可用於一個接口的定義上:
@FunctionalInterface
public interface MyFunctionalInterface {
void method();
}
一旦使用該注解來定義接口,編譯器將會強制檢查該接口是否確實有且僅有一個抽象方法,否則將會報錯。需要注意的是,即使不使用該注解,只要滿足函數式接口的定義,這仍然是一個函數式接口,使用起來都一樣。
自定義函數式接口
@FunctionalInterface
public interface MyFunctionalInterface {
/**
* 接口中唯一的抽象方法
*/
public abstract void myMethod();
}
public class DemoFunctionalInterface {
public static void main(String[] args) {
method(
() -> System.out.println("Lambda 執行啦!!!")
);
}
private static void method(MyFunctionalInterface fi) {
// 調用函數式接口中的方法
fi.myMethod();
}
}
控制台輸出:
Lambda 執行啦!!!