JDK8中爲了適應函數式響應編程模式,引入了函數式接口概念以增長Lambda表達式的功能。函數式接口其實本質上仍是一個接口,可是它是一種特殊的接口:SAM類型的接口(Single Abstract Method)。定義了這種類型的接口,使得以其爲參數的方法,能夠在調用時,使用一個lambda表達式做爲參數。從另外一個方面說,一旦咱們調用某方法,能夠傳入lambda表達式做爲參數,則這個方法的參數類型,一定是一個函數式的接口,這個類型一定會使用@FunctionalInterface進行修飾。html
從SAM原則上講,這個接口中,只能有一個函數須要被實現,可是也能夠有以下例外:java
1. 默認方法與靜態方法並不影響函數式接口的契約,能夠任意使用,即編程
函數式接口中能夠有靜態方法,一個或者多個靜態方法不會影響SAM接口成爲函數式接口,而且靜態方法能夠提供方法實現app
能夠由 default 修飾的默認方法方法,這個關鍵字是Java8中新增的,爲的目的就是使得某一些接口,原則上只有一個方法被實現,可是因爲歷史緣由,不得不加入一些方法來兼容整個JDK中的API,因此就須要使用default關鍵字來定義這樣的方法函數
2. 能夠有 Object 中覆蓋的方法,也就是 equals,toString,hashcode等方法。.net
JDK中之前全部的函數式接口都已經使用 @FunctionalInterface 定義,能夠經過查看JDK源碼來確認,如下附JDK 8以前已有的函數式接口:code
java.lang.Runnablehtm
java.util.concurrent.Callableblog
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
https://www.cnblogs.com/ownraul/p/5551545.html
http://blog.csdn.net/zjq_1314520/article/details/73556167
JDK8中新增的主要函數式接口以下:
public void testCoreInter(){
/**
* @name 消費型接口
* @use Consumer<T>
* @param T 傳入參數
* @fun 接受一個參數 無返回值
* */
Consumer<String> con=(str)->System.out.println(str);
con.accept("我是消費型接口!");/**
* @name 供給型接口
* @use Supplier<R>
* @param R 返回值類型
* @fun 無參數 有返回值
* */
Supplier<Date> supp=()-> new Date();
Date date=supp.get();
System.out.println("當前時間:"+date);/** * @name 函數型接口 * @use Function<T,R> * @param T 傳入參數 * @return R 返回值類型 * @fun 接受一個參數 有返回值 * */ Function<String, String> fun=(str)->"hello,"+str; String str=fun.apply("張俊強"); System.out.println(str); /** * @name 判定型接口 * @use Predicate<T> * @param T 傳入參數 * @return Boolean 返回一個Boolean型值 * @fun 接受一個參數 返回Boolean型值 * */ Predicate<Integer> pre=(num)->num>0; Boolean flag=pre.test(10); System.out.println(flag); }