天天看點

Java8的函數式接口你真的了解嗎?

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

函數式接口

如果你的好奇心使你翻看Runnable接口源代碼,你會發現該接口被一個@FunctionalInterface的注解修飾,這是 Java 8 中添加的新注解,用于表示 「函數式接口」。

Java8的函數式接口你真的了解嗎?

FunctionalInterface-Runnable

函數式接口又是什麼鬼?

在 Java 8 中,把那些僅有一個抽象方法的接口稱為函數式接口。如果一個接口被@FunctionalInterface注解标注,表示這個接口被設計成函數式接口,隻能有一個抽象方法,如果你添加多個抽象方法,編譯時會提示“Multiple non-overriding abstract methods found in interface XXX”之類的錯誤。

标注為 FunctionalInterface 的接口被稱為函數式接口,該接口隻能有一個自定義方法,但是可以包括從 object 類繼承而來的方法。如果一個接口隻有一個方法,則編譯器會認為這就是一個函數式接口。是否是一個函數式接口,需要注意的有以下幾點:

  • 該注解隻能标記在”有且僅有一個抽象方法”的接口上。
  • JDK8 接口中的靜态方法和預設方法,都不算是抽象方法。
  • 接口預設繼承 java.lang.Object,是以如果接口顯示聲明覆寫了 Object 中方法,那麼也不算抽象方法。
  • 該注解不是必須的,如果一個接口符合”函數式接口”定義,那麼加不加該注解都沒有影響。加上該注解能夠更好地讓編譯器進行檢查。如果編寫的不是函數式接口,但是加上了@FunctionInterface,那麼編譯器會報錯。
  • 在一個接口中定義兩個自定義的方法,就會産生 Invalid ‘@FunctionalInterface’ annotation; FunctionalInterfaceTest is not a functional interface 錯誤。

函數式方法又能做什麼?

Java8 允許你以 Lambda 表達式的方式為函數式接口提供實作,「通俗的說,你可以将整個 Lambda 表達式作為接口的實作類」。

除了Runnable之外,Java 8 中内置了許多函數式接口供開發者使用,這些接口位于java.util.function包中。如:

Java8的函數式接口你真的了解嗎?

Functional-Package

Java8的函數式接口你真的了解嗎?

如果輸入參數是基本類型,為了避免自動拆箱裝箱,可以使用其他基本類型的函數接口。

Function

interface Function 接口包含一個apply方法、兩個預設方法(compose、andThen)和一個靜态方法identity。apply是接口的基本方法。compose、andThen是一對兒方法,他們的差別在于執行的順序不同。

Java8的函數式接口你真的了解嗎?
Java8的函數式接口你真的了解嗎?
Java8的函數式接口你真的了解嗎?

Consumer

interface Consumer 接口包含一個void accept(T t);方法、預設方法andThen.

Java8的函數式接口你真的了解嗎?

隻有一個預設方法也是和它的傳回類型有關系,因為傳回的是 void。

Predicate

interface Predicate接口包含一個boolean test(T t);方法,三個預設方法(and,negate,or),還有一個靜态方法。我們也知道Predicate 接口是傳回 boolean 類型的,是以一看就知道是條件判斷的。舉幾個栗子吧:

Java8的函數式接口你真的了解嗎?

Supplier

Supplier隻有一個 get()方法。我們來看看幾個栗子:

Java8的函數式接口你真的了解嗎?

總結

函數式接口其實差别不大,隻是參數和傳回的不同,隻要想明白其中的一種,其他的也就懂了。

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/live

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-05-07

本文作者:何小H

本文來自:“

掘金

”,了解相關資訊可以關注“掘金”