公眾號「架構成長指南」,專註於生產實踐、雲原生、分散式系統、大數據技術分享。 在本文中,我們將討論一些重要且常見的 Java Lambda 表達式面試問題和解答 1.什麼是 Lambda 表達式? lambda表達式只是一個沒有任何名稱的函數,它甚至可以用作函數中的參數,Lambda 表達式有利於函 ...
公眾號「架構成長指南」,專註於生產實踐、雲原生、分散式系統、大數據技術分享。
在本文中,我們將討論一些重要且常見的 Java Lambda 表達式面試問題和解答
1.什麼是 Lambda 表達式?
lambda
表達式只是一個沒有任何名稱的函數,它甚至可以用作函數中的參數,Lambda
表達式有利於函數式編程並大大簡化了開發。
Lambda表達式的主要用途是提供函數式介面的實現。
Lambda 表達式的語法
lambda 表達式的語法由以下三個部分組成:
參數: lambda 表達式可以有零個或多個參數,並用括弧括起來。
箭頭標記:箭頭標記 ->
將參數與 lambda 主體分開。
主體: lambda 的主體包含描述方法功能的表達式或語句。
(parameters) -> expression
或者
(parameters) -> { statements; }
示例
聲明一個簡單的函數式介面:
@FunctionalInterface
interface IFunction {
int apply(int x, int y);
}
實現該介面的 lambda 表達式:
IFunction add = (x, y) -> x + y;
int result = add.apply(5, 5); // result is 10
在Java 8 Lambda 表達式中,有詳細介紹
2. 為什麼使用Lambda表達式?
Java 中的 Lambda 表達式是一項強大的功能,具有以下幾個主要優勢:
簡潔: Lambda 表達式允許我們更簡潔地編寫匿名類的實例。這使得代碼更易於閱讀和維護。
函數式編程: Lambda 表達式支持 Java 中的函數式編程概念。我們可以將函數作為方法參數傳遞,將它們作為值返回,並更自然地執行集合上的映射和過濾等操作。
可讀性:通過減少樣板代碼,lambda 表達式可以使程式的主要邏輯更加明顯。簡潔的語法可以清楚地表達正在執行的計算或操作。
並行執行支持: Lambda 與支持並行執行的 Stream API 配合良好。這使得編寫並行代碼變得更加容易,利用多核處理器而無需處理低級線程細節。
強類型: Lambda 表達式是強類型的。編譯器會推斷參數、返回值和異常的類型,這可以生成更健壯的代碼。
互操作性: Lambda 可以用在任何需要函數式介面的地方,為使用函數式介面的現有代碼、庫和框架提供良好的互操作性。
3. 以下哪些是有效的 lambda 表達式?
A:
String a, String b -> System.out.print(a+ b);
B:
() -> return;
C:
(int i) -> i;
D:
(int i) -> i++; return i;
正確答案是 C。
選項C有效。 如果主體只有一條語句,則不需要使用 return關鍵字。
4. 編寫 Java Lambda 表達式來創建線程
在 Java 中使用lambda表達式創建線程既簡單又簡潔,我們可以將希望線程執行的任務定義為 lambda,並將其傳遞給 Thread 構造函數。
示例
Runnable task = () -> {
for (int i = 0; i < 5; i++) {
System.out.println("Running thread: " + i);
}
};
Thread myThread = new Thread(task);
myThread.start();
或者通過將 lambda 表達式直接傳遞給 Thread 構造函數來進一步簡化:
Thread myThread = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Running thread: " + i);
}
});
myThread.start();
5. Lambda 表達式和函數式介面有何關係?
Lambda表達式的主要用途是提供函數式介面的實現。
lambda 表達式提供了一種緊湊且富有表現力的方式來創建函數介面的實例,並使用 lambda 主體實現介面的單個抽象方法,這促進了更加函數式的編程風格,從而使代碼更加簡潔和可讀
示例:
interface IPrint {
void print(String msg);
}
public class LambdaExample2 {
public static void main(String[] args) {
// 傳統方式
IPrint oldPrint = new IPrint() {
@Override
public void print(String msg) {
System.out.println(msg);
}
};
oldPrint.print("傳統方式輸出");
// 使用 lambda 表達式方式
IPrint withLambda = (msg) -> System.out.println(msg);
withLambda.print("lambda 表達式方式輸出");
}
}