1. 程式人生 > 其它 >Java8新特性:函式式介面

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("使用匿名內部類重寫介面中的抽象方法");
            }
        });

非常感謝你閱讀到這裡,如果這篇文章對你有幫助,希望能留下你的點贊