【辰兮要努力】:hello你好我是辰兮,很高興你能來閱讀,昵稱是希望自己能不斷精進,向着優秀程式員前行!
部落格來源于項目以及程式設計中遇到的問題總結,偶爾會有讀書分享,我會陸續更新Java前端、背景、資料庫、項目案例等相關知識點總結,感謝你的閱讀和關注,希望我的部落格能幫助到更多的人,分享擷取新知,大家一起進步!
吾等采石之人,應懷大教堂之心,願你們奔赴在各自的熱愛中…
文章目錄
-
-
- 一、函數式接口序言
- 二、函數式接口格式
-
一、函數式接口序言
在Java程式中做任何事情都要用對象來實作,函數式程式設計是種程式設計方式,強調函數的計算比指令的執行重要。簡單的說就是弱化了建立對象的過程,更加關注結果的實作。可謂應運而生!
從 Java 8 開始便出現了函數式接口(Functional Interface,以下簡稱FI)
函數式接口在Java中是指:有且僅有一個抽象方法的接口。
函數式接口,即适用于函數式程式設計場景的接口。而Java中的函數式程式設計展現就是Lambda,是以函數式接口就是可以适用于Lambda使用的接口。隻有確定接口中有且僅有一個抽象方法,Java中的Lambda才能順利地進行推導。
備注:“文法糖”是指使用更加友善,但是原理不變的代碼文法。例如在周遊集合時使用的for-each文法,其實底層的實作原理仍然是疊代器,這便是“文法糖”。從應用層面來講,Java中的Lambda可以被當做是匿名内部類的“文法糖”,但是二者在原理上是不同的。
二、函數式接口格式
函數式接口格式:隻要確定接口中有且僅有一個抽象方法即可:
修飾符 interface 接口名稱 {
public abstract 傳回值類型 方法名稱(可選參數資訊);
// 其他非抽象方法内容
}
由于接口當中抽象方法的 public abstract 是可以省略的,是以定義一個函數式接口很簡單:
public interface MyFunctionalInterface {
void myMethod();
}
@FunctionalInterface注解
與 @Override 注解的作用類似,Java 8中專門為函數式接口引入了一個新的注解: @FunctionalInterface 。該注解可用于一個接口的定義上:
@FunctionalInterface
public interface MyFunctionalInterface {
void myMethod();
}
一旦使用該注解來定義接口,編譯器将會強制檢查該接口是否确實有且僅有一個抽象方法,否則将會報錯。需要注意的是,即使不使用該注解,隻要滿足函數式接口的定義,這仍然是一個函數式接口,使用起來都一樣。
先建立一個接口,加上對應的注解@FunctionalInterface,再建立其實作類。
/*
函數式接口:有且隻有一個抽象方法的接口,稱之為函數式接口
當然接口中可以包含其他的方法(預設,靜态,私有)
@FunctionalInterface注解
作用:可以檢測接口是否是一個函數式接口
是:編譯成功
否:編譯失敗(接口中沒有抽象方法抽象方法的個數多餘1個)
*/
@FunctionalInterface
public interface MyFunctionalInterface {
//定義一個抽象方法
public abstract void method();
}
實作類
/*
@Override注解
檢查方法是否為重寫的方法
是:編譯成功
否:編譯失敗
*/
public class MyFunctionalInterfaceImpl implements MyFunctionalInterface{
@Override
public void method() {
}
}
main方法裡面測試
/*
函數式接口的使用:一般可以作為方法的參數和傳回值類型
*/
public class Demo {
//定義一個方法,參數使用函數式接口MyFunctionalInterface
public static void show(MyFunctionalInterface myFunctionalInterface){
myFunctionalInterface.method();
}
public static void main(String[] args) {
//調用show方法,方法的參數是一個接口,是以可以傳遞接口的實作類對象
show(new MyFunctionalInterfaceImpl());
//調用show方法,方法的參數是一個接口,是以我們可以傳遞接口的匿名内部類
//如果是new接口 預設會實作其方法 你可以選擇性重寫
show(new MyFunctionalInterface() {
@Override
public void method() {
System.out.println("使用匿名内部類重寫接口中的抽象方法");
}
});
//調用show方法,方法的參數是一個函數式接口,是以我們可以Lambda表達式
show(()->{
System.out.println("使用Lambda表達式重寫接口中的抽象方法");
});
//簡化Lambda表達式
show(()-> System.out.println("使用Lambda表達式重寫接口中的抽象方法"));
}
}
運作結果
使用匿名内部類重寫接口中的抽象方法
使用Lambda表達式重寫接口中的抽象方法
使用Lambda表達式重寫接口中的抽象方法
匿名内部類 :是内部類的簡化寫法。它的本質是一個 帶具體實作的父類或者父接口的 匿名的 子類對象。
在實際開發中,我們常常遇到這樣的情況:一個接口/類的方法的某個實作方式在程式中隻會執行一次,但為了使用它,我們需要建立它的實作類/子類去實作/重寫。此時使用匿名内部類的方式,可以無需建立新的類,減少代碼備援。
//調用show方法,方法的參數是一個接口,是以我們可以傳遞接口的匿名内部類
show(new MyFunctionalInterface() {
@Override
public void method() {
System.out.println("使用匿名内部類重寫接口中的抽象方法");
}
});
非常感謝你閱讀到這裡,如果這篇文章對你有幫助,希望能留下你的點贊👍 關注❤️ 分享👥 留言💬thanks!!!
2021.01.19 22:45 願你們奔赴在自己的熱愛裡!