Java8特性:函數式接口之概念篇

Java自誕生已經有十幾個年頭了,目前也已經發布了第十三個大版本,其中Java8是常用的版本中最新的一個版本。而Java8最大的特性就是:Lambda表達式、函數式接口和Stream流。

本篇我只講講函數式接口的概念,因為將所有東西放在一篇文章會顯得臃腫。廢話不多說,下面進入正題。

何為函數式接口?函數接口就是有且只有一個抽象方法的接口,被@FunctionInterface註解修飾的接口。下面我放一個JDK提供的函數式接口圖:

Java8特性:函數式接口之概念篇

Runnable接口

Java8特性:函數式接口之概念篇

Callable接口

沒錯,這就是我們實現多線程時候常用的線程任務體-“Runnable”和“Callable”接口。當然,本篇中我無意講這兩個接口,這裡只是用來舉個例子。接下來我就詳細聊聊函數式接口。

我想接口是啥就不用多費口舌了吧?如果是Java開發者,對於接口的概念及使用定能信手拈來。這裡我只解釋一下什麼叫“有且只有一個抽象方法”。

Java8之前,接口中只可以存在抽象方法,雖然大多數情況,大家都不會手動聲明。但是自Java8開始,接口中可以存在被“default”關鍵字修飾的默認方法和“static”修飾的靜態方法,比如下面這樣:

Java8特性:函數式接口之概念篇

Comparator接口

雖然此時在接口中有多個方法,但是抽象方法只有一個,此時該接口依然是函數式接口。判別是否是函數式接口的關鍵在於抽象方法的個數。至於別的如默認方法、靜態方法的個數則無須關心。

至於@FunctionInterface註解是Java8之後新增註解,可以對接口是否屬於函數式接口做一個約束。原則上,“有且只有一個抽象方法”的接口是函數式接口,但是JDK的版本是不斷迭代升級的,或許某個接口在當前版本滿足“有且只有一個抽象方法”的特徵,但是後續版本則可能會加入別的抽象方法,從而破壞“有且只有一個抽象方法”的特徵。如果發生這種變動,對已有項目的衝擊一定是巨大的。

但是有了@FunctionInterface註解就不一樣了。一旦一個接口加了該註解,則說明這個接口從設計之初就是用來作為函數式接口使用的,而不是因為版本原因讓其看起來像個函數式接口。加了註解,就當於做出了一份承諾,無論以後如何變動(可以隨便加默認方法和靜態方法),都會保證“有且只有一個抽象方法”的特徵。

所以函數式接口除了要滿足“有且只有一個抽象方法”的特徵外,還需要加@FunctionInterface註解來顯式指定和承諾。


分享到:


相關文章: