函數式接口
- 在 Java 中,當接口中只有一個抽象方法時,該接口就稱爲函數式接口。
- 函數式接口,即適用於函數式編程場景的接口。
- 而 Java 中的函數式編程就是 Lambda,即函數式接口就是可以適用於 Lambda 使用的接口。
- 接口中只有一個抽象方法時,Java 中的 Lambda 才能順利地進行類型的推導。
- 函數式接口都是先使用 Lambda 接口實現方法體,再調用接口中的方法。
函數式接口的格式
@FunctionalInterface 註解:
//這個註解是 JDK1.8 新增的特性,用來修飾接口的定義,表明該接口是一個函數式接口。
@FunctionalInterface
interface 接口名{
//返回類型 方法名(參數列表);
}
// Runnable、Comparator 都屬於函數式接口。
自定義函數式接口
無參無返回值
案例步驟1. 定義一個函數式接口 Eatable,加上註解:@FunctionalInterface2. 接口中包含抽象 eat()方法,沒有參數或返回值。3. 在 main()函數中使用 Lambda 創建 Eatable 對象,輸出一句話:吃東西。4. 調用對象的 eat()方法
案例代碼
@FunctionalInterface
interface Eatable {
void eat();
}
public class DemoFunctional {
public static void main(String[] args) {
//使用 lambda 表達式實現對象
Eatable eatable = ()-> System.out.println("吃東西");
eatable.eat();
}
}
有參有返回值
案例步驟1. 定義一個函數式接口 Sumable,加上註解:@FunctionalInterface2. 接口中包含抽象 int sum(int a, int b)方法,將兩個 int 數字相加返回 int 結果。3. 在類中通過 Lambda 實例化 Sumable 接口,並且調用 sum()方法4. 輸出計算結果的值
//有返回值,有參數
@FunctionalInterface
interface Sumable {
int sum(int a, int b);
}
public class DemoFunctional {
public static void main(String[] args) {
//實例化接口
Sumable sumable = (a, b) -> a + b;
//調用方法
int sum = sumable.sum(5, 10);
//輸出計算結果
System.out.println("計算結果:" + sum);
}
}
關於@FunctionalInterface 註解的說明:
- 該註解用在只有一個抽象方法的接口上,接口中可以存在其它的非抽象方法。
- 如果該接口有超過一個抽象方法,則編譯失敗。
- 接口中的靜態方法和默認方法都不是抽象方法。
- 接口中定義的與 Object 類同名的抽象方法不算抽象方法,因爲此接口的實現類一定是 Object 的子類,會自動實現這個接口中定義的抽象方法。
- 如果接口中只有一個抽象方法,不管是否使用@FunctionalInterface 修飾,該接口都是函數式接口.
- 加上註解的目的是讓編譯器進行語法檢查,類似於以前學的@Override 註解。
- 接口加這個註解還可以限制後期對此接口修改時再加上新的抽象方法,從而保證這個函數式接口只有一個抽象方法。
下面定義的接口是否是函數式接口,編譯能不能通過?爲什麼?
@FunctionalInterface
public interface Animal {
void eat();
public String toString();
default void sleep() {
System.out.println("睡覺");
}
static void move() {
System.out.println("行走");
}
}
接口中定義的與 Object 類同名的抽象方法不算抽象方法,
接口中的靜態方法和默認方法都不是抽象方法。
轉自函數式接口