天天看點

Java8新特性:函數式接口

【辰兮要努力】:hello你好我是辰兮,很高興你能來閱讀,昵稱是希望自己能不斷精進,向着優秀程式員前行!

部落格來源于項目以及程式設計中遇到的問題總結,偶爾會有讀書分享,我會陸續更新Java前端、背景、資料庫、項目案例等相關知識點總結,感謝你的閱讀和關注,希望我的部落格能幫助到更多的人,分享擷取新知,大家一起進步!

吾等采石之人,應懷大教堂之心,願你們奔赴在各自的熱愛中…

文章目錄

      • 一、函數式接口序言
      • 二、函數式接口格式

一、函數式接口序言

在Java程式中做任何事情都要用對象來實作,函數式程式設計是種程式設計方式,強調函數的計算比指令的執行重要。簡單的說就是弱化了建立對象的過程,更加關注結果的實作。可謂應運而生!

從 Java 8 開始便出現了函數式接口(Functional Interface,以下簡稱FI)

Java8新特性:函數式接口

函數式接口在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();    
}
           

一旦使用該注解來定義接口,編譯器将會強制檢查該接口是否确實有且僅有一個抽象方法,否則将會報錯。需要注意的是,即使不使用該注解,隻要滿足函數式接口的定義,這仍然是一個函數式接口,使用起來都一樣。

Java8新特性:函數式接口

先建立一個接口,加上對應的注解@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 願你們奔赴在自己的熱愛裡!

繼續閱讀