java中函數式接口中的定義如下:
函數式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。
需要注意以下幾點:
具體參考下面用例:
函數式接口
在上面代碼中只有test1()是抽象方法,test2()是默認方法,toString()是接口默認繼承java.lang.Object的方法,並顯式覆蓋了它,不屬於抽象方法。
@FunctionalInterface是 Java 8 新加入的一種接口,用於指明該接口類型聲明是根據 Java 語言規範定義的函數式接口。
這裡需要說明的是:
JDK中自帶了一些函數式接口,主要可以分為兩類:
在JDK1.8之前已經存在的函數式接口(包括單不限於這些):
java.lang.Runnablejava.util.concurrent.Callablejava.security.PrivilegedActionjava.util.Comparatorjava.io.FileFilterjava.nio.file.PathMatcherjava.lang.reflect.InvocationHandlerjava.beans.PropertyChangeListenerjava.awt.event.ActionListenerjavax.swing.event.ChangeListener
在JDK1.8之後新增了java.util.function這個包,用來支持函數式編程,這個包中包含了很多函數式接口。
主要舉幾個常用的例子:
Consumer<T>表示接受一個類型為T的參數,並且不返回任何結果。
Consumer
返回結果分別是:
hello world5
Supplier<T>表示無參數,返回一個結果,與Consumer<T>相反。
Supplier
返回結果是一個隨機的UUID
5db0e962-7c90-4cc4-93b4-e50f09970eff
Predicate<T>主要用於對某種類型的數據進行判斷,從而得到一個boolean值結果。
包含一個抽象方法:boolean test(T t);,根據需要實現這個方法自定義判斷規則。
三個默認方法:default Predicate<T> and(Predicate<? super T> other)
default Predicate<T> or(Predicate<? super T> other)
default Predicate<T> negate()
分別對應了與或非操作。
還有一個靜態方法:
static <T> Predicate<T> isEqual(Object targetRef)
故名思義,判斷是否相等。
Pridicate
返回結果分別是:
falsefalsefalsetrue
Function<T, R>接口表示輸入T,期望得到R,T和R可以是相同的類型或者不同類型。
包含一個抽象方法R apply(T t);接收參數T,輸出參數R。
包含兩個默認方法andThen()和compose()方法用來進行組合操作,,可以簡單理解為分別是對輸出結果和輸入再次進行加工操作。
包含一個靜態方法static <T> Function<T, T> identity(),這個靜態方法僅僅是將輸入對象輸出。
Function
輸出結果分別是:
2s3s2S
主要常見的就是這幾類接口,其他的接口基本上都繼承自這幾個接口,借用一張圖,如下:
java.util.function包下的函數式接口
在java中我們一般常用的是編程方式屬於命令式編程。函數式編程與命令式編程我個人理解區別在於:在命令式編程中我們輸入的是參數,方法中包含的是處理過程,而函數式編程中我們輸入的是處理過程,也就是說把處理過程作為處理參數傳入到方法中,允許把函數本身作為參數傳入另一個函數,還允許返回一個函數。