所謂函數式接口,指的是隻有一個抽象方法的接口。
函數式接口可以被隱式轉換爲Lambda表達式。
函數式接口可以用@FunctionalInterface註解標識。
JDK1.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
JDK1.8之後,又添加了一組函數式接口:
java.util.function.*
這個路徑下有一大堆接口,都是函數式接口,代表了接口調用的各種不同應用場景。
另外,在JDK1.8開始,之前就有的函數式接口(比如Runnable接口)也都添加了@FunctionalInterface註解。
下面舉幾個java.util.function下的函數式接口的例子。
1,Consumer<T>
接口唯一的抽象方法是:
void accept(T t);
這是一個單參數,無返回值的方法,參數是泛型類。這個接口被稱爲消費型接口,因爲沒有返回值,接口裏面幹了什麼和調用方沒什麼關係。
這種單參數無返回值的接口我們可以這麼用Lambda表達式:
import java.util.function.Consumer;
public class Test {
public static void main(String[] args) {
Consumer consumer = (a) -> System.out.println("this is " + a);
consumer.accept("123");
}
}
輸出的結果是:
this is 123
2,Supplier<T>
接口唯一的抽象方法是:
T get();
這是一個無參數,有返回值的方法,返回值類型是泛型類。這個接口被稱作供給型接口。
這種無參數有返回值的方法我們可以這麼用:
import java.util.function.Supplier;
public class Test {
public static void main(String[] args) {
Supplier<String> supplier = () -> "abc";
String result = supplier.get();
System.out.println(result);
}
}
3,ToIntFunction<T>
接口唯一的抽象方法是:
int applyAsInt(T value);
這是一個單參數,返回值爲int的方法,參數類型是泛型類。
使用例子:
import java.util.function.ToIntFunction;
public class Test {
public static void main(String[] args) {
ToIntFunction<String> toIntFunction = (a) -> {
return Integer.parseInt(a);
};
int result = toIntFunction.applyAsInt("123");
System.out.println(result);
}
}
關於@FunctionalInterface註解
@FunctionalInterface註解是對函數式接口的標識,他的作用是對接口進行編譯級別的檢查,如果一個接口使用了這個註解,但是寫了兩個抽象方法,會出現編譯錯誤。
以上