Java 8 | 函數式接口
函數式接口(Functional Interface
)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。
函數式接口可以被隱式轉換為lambda
表達式。
Lambda
的設計者們為了讓現有的功能與Lambda
表達式良好兼容,考慮了很多方法,於是產生了函數接口這個概念。函數接口指的是只有一個函數的接口,這樣的接口可以隱式轉換為Lambda
表達式。
java.lang.Runnable
和java.util.concurrent.Callable
是函數式接口的最佳例子。
函數式接口可以對現有的函數友好地支持lambda
:
JDK 1.8
之前已有的函數式接口:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.security.PrivilegedAction
- java.util.Comparator
- java.io.FileFilter
- java.nio.file.PathMatcher
- java.lang.reflect.InvocationHandler
- java.beans.PropertyChangeListener
- java.awt.event.ActionListener
- javax.swing.event.ChangeListener
JDK 1.8
新增加的函數接口:
java.util.function
註:java.util.function相關的方法,可以直接看官方Documentation
在實踐中,函數式接口非常脆弱:只要某個開發者在該接口中添加一個函數,則該接口就不再是函數式接口進而導致編譯失敗。為了克服這種程式碼層面的脆弱性,並顯式說明某個接口是函數式接口,Java 8
提供了一個特殊的註解@FunctionalInterface
(Java
庫中的所有相關接口都已經帶有這個註解了),舉個簡單的函數式接口的定義:
1 |
|
不過有一點需要注意,默認方法和靜態方法不會破壞函數式接口的定義,因此如下的程式碼是合法的。
1 |
|
函數式接口實例
Predicate <T>
接口是一個函數式接口,它接受一個輸入參數T
,返回一個布爾值結果。
該接口包含多種默認方法來將Predicate
組合成其他復雜的邏輯(比如:與,或,非)。
該接口用於測試對像是true
或false
。
我們可以通過以下實例(Java8Tester.java
)來了解函數式接口Predicate <T>
的使用:
1 | import java.util.Arrays; |
輸出的結果為:
1 | 輸出所有資料: |
註:以上參考了
Java 8 Lambda新語法,簡化程式,增強效能
Java 8 新特性
Java 8的新特性—终极版
现代化 Java - Java8 指南