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-hant/n/253902.html