一、什麼是函數式介面
在 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-tw/n/151662.html