一、什麼是函數式接口
在 Java 8 中,函數式接口是指只有一個方法的接口。由於函數式接口只有一個方法,所以它可以被lambda表達式、方法引用和構造函數引用等語法特性所使用,並且可以用於函數式編程。
函數式接口的聲明使用註解@FunctionalInterface,該註解用於編譯器檢查,確保接口中只有一個方法。如果編寫的接口符合函數式接口的要求,但沒有使用該註解,程序仍然可以正常編譯。如果接口中定義了超過一個的抽象方法,編譯器將會報錯。
@FunctionalInterface
public interface MyInterface {
public void myMethod();
}
上面代碼是一個簡單函數式接口示例。它只有一個抽象方法myMethod, 可以包含任意數量的默認方法或靜態方法。
二、Lambda表達式
Lambda表達式是Java 8中最重要的新特性之一,它可以簡化Java代碼的書寫。
Lambda表達式的語法如下:
(parameters) -> expression
Lambda表達式由三個部分組成:
- 一組參數
- 箭頭符號 ->
- 一組語句
Lambda表達式有多種形式,比如:
() -> System.out.println("Hello Lambda!");
x -> x + 1
(x, y) -> x * y
(x, y) -> { int result = x + y; return result; }
三、方法引用
方法引用是一種簡化Lambda表達式的語法形式,它用於直接引用已有Java類或對象的方法或構造方法。
方法引用的語法格式如下:
對象::方法
類::方法
類::靜態方法
類::new
方法引用示例:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
list.forEach(System.out::println);
上面代碼中,System.out.println是一個靜態方法,可以使用類::靜態方法的方式進行方法引用。
四、構造函數引用
構造函數引用用於直接引用已有Java類或對象的構造函數。它的語法格式如下:
類::new
構造函數引用示例:
Function<String, Integer> converter = Integer::new;
Integer integer = converter.apply("123");
System.out.println(integer);
上面代碼中,通過Integer::new進行構造函數引用,並使用apply方法對字符串進行類型轉換。
五、內置函數式接口
Java 8中提供了一些函數式接口,這些接口被稱為內置函數式接口。Java 8的內置函數式接口主要分為四種類型:Supplier、Consumer、Function和Predicate。
1. Supplier接口
Supplier是一個提供值的接口,它不接受任何參數,僅僅返回一個值。它的泛型表示返回的類型。
@FunctionalInterface
public interface Supplier<T> {
T get();
}
示例:
Supplier<String> supplier = () -> "Hello World!";
System.out.println(supplier.get());
上面代碼中,使用Lambda表達式實現Supplier接口,並將Lambda表達式返回的字符串打印到控制台。
2. Consumer接口
Consumer是一個接受一個參數並且無需返回值的接口。
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
示例:
Consumer<String> consumer = (str) -> System.out.println(str);
consumer.accept("Hello World!");
上面代碼中,使用Lambda表達式實現Consumer接口,並將Lambda表達式接收的字符串打印到控制台。
3. Function接口
Function接口接收一個參數,並返回一個結果。該接口定義了一個名為apply的方法,該方法接收一個參數並返回一個結果。
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
示例:
Function<String, Integer> converter = Integer::valueOf;
System.out.println(converter.apply("123"));
上面代碼中,使用構造函數引用獲得一個字符串轉換成整型的函數,並將其應用於一個字符串,並將結果打印在控制台上。
4. Predicate接口
Predicate接口接收一個參數,並返回一個是否滿足條件的boolean值。該接口定義了一個名為test的方法,該方法接收一個參數,並返回一個boolean值。
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
示例:
Predicate<String> predicate = (str) -> str.length() > 5;
System.out.println(predicate.test("Hello World!"));
上面代碼中,使用Lambda表達式實現Predicate接口,並將該接口應用到一個字符串中,判斷該字符串的長度是否大於5,並將該判斷結果打印到控制台上。
六、結語
Java 8的函數式接口是一項重要的語言特性,它使得Java的函數式編程更加方便。除了上述介紹的內置函數式接口外,Java 8還提供了其他函數式接口,如UnaryOperator、BinaryOperator、BiFunction等。
儘管Java 8的函數式編程還有一些缺點,比如函數的可變性和某些情況下的性能問題,但是Java 8的函數式接口仍然是Java編程的一個重要的組成部分,值得開發人員深入學習和掌握。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/151662.html