成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:說說Lambda表達(dá)式底層原理?

開發(fā) 前端
Lambda 表達(dá)式其實(shí)是匿名內(nèi)部類的語法糖,這個(gè)語法糖在程序執(zhí)行時(shí)會(huì)進(jìn)行兌現(xiàn),也就是生成匿名內(nèi)部類并進(jìn)行任務(wù)執(zhí)行。

Lambda 表達(dá)式是 Java 8 引入的一種簡潔的表示匿名方法的方式,使用它可以用于替代某些匿名內(nèi)部類對(duì)象,從而讓程序更簡潔,可讀性更好。但 Lambda 表達(dá)式的底層是如何實(shí)現(xiàn)的呢?接下來我們一起來看。

1.未Lambda表達(dá)式

未使用 Lambda 表達(dá)式之前,我們創(chuàng)建一個(gè)線程,可以這樣寫:

Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("t1");
    }
});
t1.start();

其中 Runnable 匿名內(nèi)部類,查看 Runnable 源碼,我們可以看到 Runnable 的實(shí)現(xiàn)如下:

(1)什么是匿名內(nèi)部類?

匿名內(nèi)部類是在 Java 中定義的一個(gè)沒有名稱的內(nèi)部類。它通常在一個(gè)類的成員位置或者方法體內(nèi)直接定義,并且立即實(shí)例化。

匿名內(nèi)部類的主要用途在于簡化代碼,避免為了實(shí)現(xiàn)一個(gè)簡單的功能而定義一個(gè)完整的類。它特別適用于只需要一次使用的類,比如實(shí)現(xiàn)一個(gè)接口的單方法(即函數(shù)式接口)的場(chǎng)合。

PS:自從 Java 8 引入 Lambda 表達(dá)式后,很多原本使用匿名內(nèi)部類的地方可以被更簡潔的 Lambda 表達(dá)式替代。

上面代碼中的 new Runnable 就是一個(gè)標(biāo)準(zhǔn)匿名內(nèi)部類的使用。

(2)什么是@FunctionalInterface?

@FunctionalInterface 是 Java 8 引入的一個(gè)注解,它用于標(biāo)記一個(gè)接口為函數(shù)式接口

函數(shù)式接口是指只包含一個(gè)抽象方法的接口。這個(gè)注解雖然不是必需的,但它提供了一種明確的方式告訴編譯器和開發(fā)者,這個(gè)接口是設(shè)計(jì)為函數(shù)式接口的。

@FunctionalInterface 注解的作用如下:

  • 編譯時(shí)檢查:當(dāng)一個(gè)接口被標(biāo)記為 @FunctionalInterface 時(shí),編譯器會(huì)檢查該接口是否只有一個(gè)抽象方法。如果不符合函數(shù)式接口的定義(即存在多個(gè)抽象方法),編譯器會(huì)報(bào)錯(cuò),提醒開發(fā)者修正。這為開發(fā)者提供了明確的編譯時(shí)保障,確保所標(biāo)記的接口確實(shí)符合函數(shù)式接口的要求。
  • 代碼明確性:即使不加 @FunctionalInterface 注解,只要接口符合函數(shù)式接口的定義,它仍然可以被視為函數(shù)式接口。但注解的存在增加了代碼的明確性和可讀性,使得其他開發(fā)者更容易理解該接口的設(shè)計(jì)意圖。
  • 支持 Lambda 表達(dá)式:函數(shù)式接口的主要目的是為了支持 Lambda 表達(dá)式。通過 Lambda 表達(dá)式,開發(fā)者可以以更簡潔的方式實(shí)現(xiàn)函數(shù)式接口的抽象方法,從而減少模板代碼,使代碼更加簡潔和易于理解。由于 Lambda 表達(dá)式本身不包含類型信息,Java 編譯器需要一種機(jī)制來確定 Lambda 表達(dá)式對(duì)應(yīng)的目標(biāo)類型。函數(shù)式接口就扮演了這一角色——Lambda 表達(dá)式可以被賦值給任何兼容的函數(shù)式接口類型,編譯器會(huì)依據(jù)接口的唯一抽象方法來推斷 Lambda 表達(dá)式的參數(shù)類型和返回類型。

在 Java 標(biāo)準(zhǔn)庫中,有許多使用 @FunctionalInterface 注解的接口,如 java.util.function 包下的 Function、Predicate、Consumer 等,這些接口都是函數(shù)式接口,廣泛用于數(shù)據(jù)處理、過濾、轉(zhuǎn)換等操作。此外,在 Spring Boot 框架中,也經(jīng)常使用函數(shù)式接口來定義事件監(jiān)聽器、回調(diào)函數(shù)等。

2.使用Lambda表達(dá)式

未使用 Lambda 表達(dá)式之前,我們創(chuàng)建一個(gè)線程是這樣寫的:

Thread t1 = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("t1");
    }
});
t1.start();

而用了 Lambda 表達(dá)式,我們可以這樣寫:

Thread t1 = new Thread(() -> { System.out.println("t1"); });
t1.start();

從上述代碼可以看出,當(dāng)我們使用 Lambda 表達(dá)式之后,代碼就變得更簡潔和優(yōu)雅了。

3.Lambda詳解

Lambda 表達(dá)式的語法形式如下:

(parameters) -> expression

或者是:

(parameters) -> { statements; }

以上語法含義如下:

  • 參數(shù)列表:在圓括號(hào)內(nèi)的部分,用于定義傳遞給 Lambda 體的參數(shù)。參數(shù)列表可以為空,也可以包含多個(gè)參數(shù),參數(shù)之間用逗號(hào)隔開。
  • 箭頭符號(hào)是 Lambda 表達(dá)式的分隔符,將參數(shù)列表與表達(dá)式或語句塊分隔開。
  • Lambda 體:包含了具體的執(zhí)行邏輯,可以是一個(gè)表達(dá)式或是一個(gè)由多個(gè)語句組成的代碼塊。

(1)使用場(chǎng)景

Lambda 表達(dá)式主要用于執(zhí)行函數(shù)式接口(Function Interface),即只有一個(gè)抽象方法的接口。常見的函數(shù)式接口包括 java.util.function 包下的 Predicate、Function、Consumer 等。

(2)舉個(gè)例子

假設(shè)我們有一個(gè)List,并且我們想要對(duì)這個(gè)列表進(jìn)行過濾操作,只保留偶數(shù)元素。使用 Lambda 表達(dá)式可以非常方便地實(shí)現(xiàn)這一功能:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
        // 使用 Lambda 表達(dá)式過濾出偶數(shù)
        List<Integer> evenNumbers = numbers.stream()
                                           .filter(n -> n % 2 == 0)
                                           .collect(Collectors.toList());
        System.out.println(evenNumbers); // 輸出 [2, 4, 6, 8]
    }
}

在這個(gè)例子中,n -> n % 2 == 0 是一個(gè) Lambda 表達(dá)式,它接受一個(gè)整數(shù) n 作為輸入?yún)?shù),并返回一個(gè)布爾值。這個(gè) Lambda 表達(dá)式被用作 filter 方法的參數(shù),該方法期望一個(gè) Predicate類型的函數(shù)式接口實(shí)例。

4.Lambda底層原理

Lambda 底層運(yùn)行原理如下:

  1. 在程序運(yùn)行時(shí),會(huì)在類中生成一個(gè)匿名內(nèi)部類,匿名內(nèi)部類會(huì)實(shí)現(xiàn)接口,并重寫接口中的抽象方法。
  2. 類中會(huì)生成一個(gè)靜態(tài)方法,靜態(tài)方法中的代碼就是 Lambda 表達(dá)式中的代碼。
  3. 匿名內(nèi)部類重寫的抽象方法,會(huì)調(diào)用上一步的靜態(tài)方法,從而實(shí)現(xiàn) Lambda 代碼的執(zhí)行。

所以,綜合來說,Lambda 表達(dá)式其實(shí)是匿名內(nèi)部類的語法糖,這個(gè)語法糖在程序執(zhí)行時(shí)會(huì)進(jìn)行兌現(xiàn),也就是生成匿名內(nèi)部類并進(jìn)行任務(wù)執(zhí)行。

責(zé)任編輯:姜華 來源: 磊哥和Java
相關(guān)推薦

2024-02-29 16:49:20

volatileJava并發(fā)編程

2024-08-29 16:30:27

2024-03-14 14:56:22

反射Java數(shù)據(jù)庫連接

2025-04-08 00:00:00

@AsyncSpring異步

2024-03-05 10:33:39

AOPSpring編程

2024-08-22 10:39:50

@Async注解代理

2020-07-02 07:52:11

RedisHash映射

2024-11-19 15:13:02

2023-12-27 18:16:39

MVCC隔離級(jí)別幻讀

2025-04-16 00:00:01

JWT客戶端存儲(chǔ)加密令

2024-08-12 17:36:54

2024-03-28 10:37:44

IoC依賴注入依賴查找

2024-07-31 08:28:37

DMAIOMMap

2024-12-06 07:00:00

2024-03-11 18:18:58

項(xiàng)目Spring線程池

2024-03-22 06:56:24

零拷貝技術(shù)數(shù)據(jù)傳輸數(shù)據(jù)拷貝

2021-05-20 08:34:03

CDN原理網(wǎng)絡(luò)

2024-09-20 08:36:43

零拷貝數(shù)據(jù)傳輸DMA

2024-03-06 15:38:06

Spring微服務(wù)架構(gòu)擴(kuò)展組件

2024-06-04 09:02:03

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久er精品 | www.亚洲视频 | 欧美精品福利 | 久久极品| 天天操夜夜拍 | 亚洲一区 中文字幕 | 国产成人短视频在线观看 | 狠狠操狠狠操 | 91久久夜色| 请别相信他免费喜剧电影在线观看 | 亚洲在线成人 | 嫩呦国产一区二区三区av | 99精品国产在热久久 | 中文久久| 色黄网站 | 日日干日日操 | 亚洲欧洲日本国产 | av在线一区二区三区 | 色综合中文| 国产午夜精品理论片a大结局 | 91国内精品 | 美女艹b| 免费看91| 激情视频中文字幕 | 国产一级一级毛片 | 亚洲一区 | 亚洲一区在线播放 | 久久毛片网站 | 国产中文原创 | 久久机热 | www.玖玖玖 | 国内精品久久久久久久 | a免费在线| 国内久久| 69xxx免费| 亚洲精品在线播放 | 国产精品区一区二区三 | 最新国产精品视频 | 国产在线一级片 | 欧美三级在线 | 成人午夜免费福利视频 |