來源:DZone 以下是 Java 函數式介面的概述:目的、範例、lambda 表達式和預定義介面清單。 作為一種物件導向的程式語言,Java以前無法擁有獨立的功能,因為語言中除了一些原始資料類型和方法之外,一切都是圍繞著類別和物件的。然而,Java 8 引入了一個稱為函數式介面的新概念,也引入了一些其他功能,如 Lambda 表達式、Time API、Stream API 等。這些功能介面是什麼以及如何定義它們?讓我們來看看吧!
什麼是介面?
介面是一組決定係統元素互動的規則。它也被稱為包含抽象方法和靜態常數的類別的輪廓。介面可以包含一個或多個抽象方法。介面還允許您指定類別的要求,即類別需要哪些方法。簡而言之,介面就像每個實作類別都必須遵守的契約。這是一個例子:Interface A1
{
void method1();
String method2(String X);
}
Class A1 implements A
{
@Override
public void method1(){}
@Override
public String method2(String X) { return x; }
}
如果實作該介面的類別沒有聲明該介面的所有方法,則程式碼將不會運行並會產生錯誤:「錯誤:A1 不是抽象的,並且不會重寫 A1 中的抽象方法。(錯誤:A1不是抽象的,不會重寫A1中的抽象方法)。在JDK 8之前,介面不能定義實現,但現在可以為介面方法添加預設實現。我們還可以定義靜態方法和預設方法,這介面中無需物件即可呼叫介面主要用於實現程式碼中的多重繼承和鬆散耦合。現在我們對介面有了清晰的認識,下面我們來看看什麼是函數式介面以及它是如何運作的。
什麼是函數式介面?
函數式介面也稱為單一抽象方法 (SAM) 介面。顧名思義,它最多可以有一個抽象方法。函數式介面可以有多個帶有實作的靜態方法和預設方法,以及一個附加的抽象方法。若要將介面標記為函數式接口,可以使用@FunctionalInterface註解。需要避免錯誤地聲明附加方法。函數式介面之所以如此受歡迎,是因為它能夠使用 lambda 表達式建立接口,而無需使用匿名且繁瑣的類別實作。在函數介面中使用abstract關鍵字是可選的,因為介面中定義的方法預設是抽象的。什麼是 lambda 表達式?
lambda 表達式是一種未命名或匿名方法,它不會自行執行,但用於實作函數式介面的某些方法。它的定義如下:(parameter list) -> lambda body
您在程式碼中看到的箭頭運算子 ( -> ) 稱為 lambda 運算子。例如,如果我們有以下方法:
double getGoldenRatioValue() {
return 1.61803;
}
使用 lambda 表達式,我們可以這樣寫:
() -> 1.61803
正如你所看到的,lambda函數中的方法沒有參數,因此語句的左邊是空的。由於右側決定操作,因此在本例中它將傳回黃金比例的值:1.61803。在 Java 8 之前,實作介面或建立內部類別物件至關重要,但在 Java 8 中,我們現在需要做的就是將 lambda 表達式指派給函數式介面。
功能介面範例
若要建立函數式接口,您可以使用@FunctionalInterface註解或使用Java的預先定義函數式介面。實施例1
- 首先,我們將標記@FunctionalInterface並建立一個名為MyInterface的接口,該接口由抽象getGoldenRationValue()方法呼叫。
- 然後我們將建立一個公共類別main來執行該方法。
- 要在函數式介面中使用 lambda 表達式,我們將宣告對MyInterfaceDemo 的引用,然後將 lambda 表達式指派給該引用。
- 最後,我們將使用參考介面列印出黃金比例值。
import java.lang.FunctionalInterface;
// Creation и маркировка функционального интерфейса
@FunctionalInterface
interface MyInterface {
// Это абстрактный метод
double getGoldenRatioValue();
}
public class Main {
public static void main( String[] args ) {
//декларируем ссылку на функциональный интерфейс
MyInterface ref;
//используем Lambda Expression
ref = () -> 1.61803;
System.out.println("Value of Golden Ratio = " + ref.getGoldenRatioValue());
}
}
結論:
黃金比例值 = 1.61803
實施例2
- 在此範例中,我們將使用預先定義的函數介面ToDoubleFunction,它接受T參數並傳回雙精度值作為輸出。
- ToDoubleFuntion包含一個名為applyasDouble()的抽象方法。
- 最後,我們列印訊息的整個長度,包括空格。
import java.util.function.ToDoubleFunction;
public class MyInterface2 {
public static void main(String[] args) {
ToDoubleFunction<String> length = x -> x.length();
System.out.println(length.applyAsDouble("This is an example of predefined functional interface."));
}
}
結論:
54.0
預裝功能介面列表
現在我們知道如何定義函數式接口,讓我們看看有多少預定義(內建)函數式介面。函數式介面主要有 4 種類型,可以在不同的情況下實現:Consumer、Predicate、Function和Supplier。在這四個介面中,Consumer、Function和Predicate還有額外的函數介面。以下是 Java 中所有內建或預先定義介面的清單。 筆記。下表中的T、U、R分別代表運算的第一個參數(T)、第二個參數(U)和結果(R)的型別。介面 | 類型 |
---|---|
可運行 | → |
雙消費者(T, U) | T、U → |
雙函數(T、U、R) | T、U → R |
二元運算符 | T,T <→ R |
雙謂詞<T, U> | T、U → 布林值 |
布爾供應商 | → 布林值 |
消費者 | T → |
雙二元運算符 | 雙,雙→雙 |
雙重消費者 | 雙 → |
雙功能 | 雙→R |
雙謂詞 | 雙精度 → 布林值 |
雙供應商 | 布林值 → |
DoubleToInt 函數 | 雙精度 → 整數 |
DoubleToLong 函數 | 雙→長 |
雙一元運算符 | 雙→雙 |
函數<T, R> | 右→右 |
整數二元運算符 | 整數 → 整數 |
國際消費者 | 整數 → |
整數函數 | 整數 → R |
內部謂詞 | 整數 → 布林值 |
國際供應商 | → 整數 |
整數轉雙精度函數 | 整數 → 雙精度 |
IntToLong函數 | 整型 → 長整型 |
整型一元運算符 | 整數 → 整數 |
長二元運算符 | 長長→長 |
長消費者 | 長→ |
長函數 | 長 → R |
長謂詞 | 長→ |
長供應商 | → 長 |
長到雙功能 | 長→雙 |
LongToInt函數 | 長→整數 |
長一元運算符 | 長→長 |
對象雙消費者 | T,雙 → |
ObjIntConsumer | T,整數 → |
對象長消費者 | T,長 → |
謂詞 | T → 布林值 |
供應商 | →T |
ToDoubleBiFunction<T, U> | T、U → 雙 |
至雙功能 | T → 雙 |
ToIntBiFunction<T, U> | T、U → 整數 |
ToInt函數 | T → 整數 |
ToLongBiFunction<T, U> | T、U → 長 |
長函數 | T → 長 |
一元運算符 | 時間 → 時間 |
讓我們總結一下
從這篇文章中需要記住的一些關鍵要點:- 介面作為一種抽象機制工作。
- 函數式介面可以有多個帶有實作的靜態方法和預設方法,以及一個附加的抽象方法。
- 預設情況下,函數式介面中定義的方法是抽象的,因此不再需要使用abstract關鍵字。
- lambda 表達式是一種匿名方法,它本身不執行,而是用於實作函數式介面的某些方法。
- 若要建立函數式接口,您可以使用@FunctionalInterface註解或使用Java的預先定義函數式介面。
GO TO FULL VERSION