Java8新特性:函式式介面
技術標籤:Java基礎知識總結javalambda函式式介面經驗分享Java8新特性
【辰兮要努力】: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("使用匿名內部類重寫介面中的抽象方法");
}
});
非常感謝你閱讀到這裡,如果這篇文章對你有幫助,希望能留下你的點贊