Java 8 引入了新的概念”函數式介面”,用來支持Lambda表達式。函數式介面是指只有一個抽象方法的介面,即SAM介面(Single Abstract Method Interface)。在函數式介面中,可以定義多個默認方法和靜態方法,但只能有一個抽象方法。
一、定義函數式介面
函數式介面的定義非常簡單,只需要在介面上加上@FunctionalInterface註解即可,如下所示:
@FunctionalInterface public interface MyFunctionalInterface { void apply(String str); }
在這個介面中,我們定義了一個抽象方法apply(),接受一個字元串參數。注意到這裡使用了@FunctionalInterface註解,這是為了方便編譯器檢查這個介面是否只包含一個抽象方法。
二、使用函數式介面
使用函數式介面可以通過Lambda表達式、方法引用等方式來提供實現。需要注意的是,提供的實現方法的參數和返回值必須與抽象方法一致。
1. Lambda表達式
Lambda表達式可以用來快速實現函數式介面,例如:
MyFunctionalInterface myLambda = (str) -> System.out.println(str); myLambda.apply("Hello Lambda!");
在這個例子中,我們定義了一個Lambda表達式,並創建了一個函數式介面實例,再調用apply()方法,輸出”Hello Lambda!”。
2. 方法引用
另外一種實現函數式介面的方式是使用方法引用,例如:
MyFunctionalInterface myMethodRef = System.out::println; myMethodRef.apply("Hello Method Reference!");
這個例子使用了System類的靜態方法println(),並將它作為方法引用傳遞給MyFunctionalInterface介面的實例。
三、函數式介面的分類
Java 8為我們提供了眾多的函數式介面,這些介面被分為四類:函數型介面、供給型介面、消費型介面和斷言型介面,下面我們來分別介紹。
1. 函數型介面
函數型介面(Function),它接受一個參數並且返回一個結果。如下所示:
@FunctionalInterface interface Function { R apply(T t); }
其中T表示輸入類型,R表示輸出類型。例如:
Function func = (x) -> x.toString(); System.out.println(func.apply(10));
這個例子定義了一個函數式介面func,接受一個整型參數並返回一個字元串類型的結果。在Lambda表達式中,我們將整型參數轉換為字元串類型返回。
2. 供給型介面
供給型介面(Supplier),它不接受參數,但返回一個結果。如下所示:
@FunctionalInterface interface Supplier { T get(); }
例如:
Supplier supplier = () -> "Hello World!"; System.out.println(supplier.get());
這個例子定義了一個供給型介面supplier,它返回一個固定的字元串”Hello World!”。
3. 消費型介面
消費型介面(Consumer),它接受一個參數但沒有返回值。如下所示:
@FunctionalInterface interface Consumer { void accept(T t); }
例如:
Consumer consumer = (str) -> System.out.println(str); consumer.accept("Hello Consumer!");
這個例子定義了一個消費型介面consumer,接受一個字元串參數並將其列印到控制台上。
4. 斷言型介面
斷言型介面(Predicate),它接受一個參數並返回一個布爾類型的值。如下所示:
@FunctionalInterface interface Predicate { boolean test(T t); }
例如:
Predicate predicate = (x) -> x > 0; System.out.println(predicate.test(-2)); System.out.println(predicate.test(2));
這個例子定義了一個斷言型介面predicate,接受一個整型參數並返回一個布爾類型的值,表示這個整數是否大於0。我們在Lambda表達式中,對輸入參數進行判斷,返回true或false。
四、總結
本文詳細介紹了函數式介面的定義、使用方法和分類,同時也給出了相應的代碼示例。函數式介面是支持Lambda表達式的基礎,掌握函數式介面對於掌握Java 8的Lambda表達式來說至關重要。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/253902.html