Java8 新功能筆記 (1) - Functional Interfaces

Functional Interfaces

Java 8 的新功能最讓大家有印象的是 Lambda 表達式,但在使用 Lambda 表達式之前,要先瞭解另一個新的功能,叫做 Functional Interfaces 函式介面。其實它不是新的東西,只是被賦予特定任務,所以重新定義它的名稱及用途。
函式介面的定義是
只擁有一個抽象方法的介面。
看起來會像這樣:
@FunctionalInterface
public interface Message {
    public abstract void hello(String msg);
}
@FunctionalInterface 是新的標註,可以明確指示編譯器,這是一個函式界面。當你加上這個標註時,這個介面中將只能宣告一個抽象方法,如果你宣告兩個以上的抽象方法,編譯器將會立即告訴你這裡是錯的。

如果不加標註,但只宣告一個抽象方法的話,它仍然是函式介面,只是少了編譯器的檢查。

abstract 寫不寫都可以,因為在 Java 7 之前,介面中的任何方法本來就都是抽象的,但在 Java 8 中,介面有了新的定義規則。

新的介面定義

在 Java 8 中,介面可以加入不是抽象的方法,即包含實作的方法,但必須額外使用兩個關鍵字 default 及 static 來指定,如下範例:
public interface MyInterface {
    default void show1(){
        //...
    }

    static void show2() {
        //...
    }

    void show3();

//錯的
//    void show4(){
//
//    }
}
指示為 default 或 static 的方法並沒有什麼特別,和一般類別中的方法是相同的。宣告為 default 的方法等同於一般類別中的成員方法;宣告為 static 的方法則屬於類別方法。

實作這個介面的類別,可以直接使用 this.show1(),這個介面的方法看起來就像是這個類別自己的方法,就像是這個類別被「擴充」,多了一些原本沒有的方法。

要使用 static 方法則是 MyInterface.show2(); 和一般靜態方法的呼叫方式相同。至於 show3() 因為沒有實作內容,所以 implement 它的類別,必須去實作(即覆寫Override)它的內容。show4() 因為沒有宣告為 default 或 static 就不能通過編譯。

在介面中,所有方法預設都是 public ,所以可以省略不寫。所有沒被宣告為 default 或 static 的方法,預設都是抽象的,不可以有實作內容,所以 abstract 也可以省略。
本文網址:http://blog.tonycube.com/2015/10/java-java8-1-functional-interfaces.html
Tony Blog 撰寫,轉載時請註明出處及文章連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。