自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

微服務(wù)為什么要容器化?

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

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

1.未Lambda表達式

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

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

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

圖片圖片

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

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

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

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

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

1.2 什么是@FunctionalInterface?

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

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

@FunctionalInterface 注解的作用如下:

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

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

2.使用Lambda表達式

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

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

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

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

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

3.Lambda詳解

Lambda 表達式的語法形式如下:

(parameters) -> expression

或者是:

(parameters) -> { statements; }

以上語法含義如下:

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

3.1 使用場景

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

3.2 舉個例子

假設(shè)我們有一個List,并且我們想要對這個列表進行過濾操作,只保留偶數(shù)元素。使用 Lambda 表達式可以非常方便地實現(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 表達式過濾出偶數(shù)
        List<Integer> evenNumbers = numbers.stream()
                                           .filter(n -> n % 2 == 0)
                                           .collect(Collectors.toList());
        System.out.println(evenNumbers); // 輸出 [2, 4, 6, 8]
    }
}

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

4.Lambda底層原理

Lambda 底層運行原理如下:

在程序運行時,會在類中生成一個匿名內(nèi)部類,匿名內(nèi)部類會實現(xiàn)接口,并重寫接口中的抽象方法。

類中會生成一個靜態(tài)方法,靜態(tài)方法中的代碼就是 Lambda 表達式中的代碼。

匿名內(nèi)部類重寫的抽象方法,會調(diào)用上一步的靜態(tài)方法,從而實現(xiàn) Lambda 代碼的執(zhí)行。

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

責(zé)任編輯:武曉燕 來源: 二進制跳動
相關(guān)推薦

2017-03-06 17:30:11

微服務(wù)架構(gòu)系統(tǒng)

2019-09-19 10:49:52

微服務(wù)架構(gòu)SOA

2020-01-18 09:35:03

微服務(wù)團隊架構(gòu)

2019-01-10 13:17:15

微服務(wù)容器微服務(wù)架構(gòu)

2024-12-31 11:05:07

2016-09-22 16:06:21

微服務(wù)架構(gòu)RPC框架

2025-04-10 08:00:00

服務(wù)限流開發(fā)高并發(fā)

2016-01-20 09:54:51

微服務(wù)架構(gòu)設(shè)計SOA

2020-04-21 11:03:34

微服務(wù)數(shù)據(jù)工具

2021-09-08 10:32:29

微服務(wù)容器化Serverless

2024-10-29 08:44:18

2022-07-11 14:53:37

微服務(wù)容器IT

2013-08-29 09:38:32

虛擬化關(guān)鍵業(yè)務(wù)

2022-06-12 23:36:26

微服務(wù)架構(gòu)單體應(yīng)用

2022-05-25 08:00:00

開發(fā)微服務(wù)企業(yè)

2023-12-19 07:56:08

微服務(wù)軟件測試左移測試

2022-07-13 13:29:56

微服務(wù)容器開發(fā)

2023-08-22 11:00:16

云計算容器微服務(wù)

2024-09-03 08:17:59

2023-09-15 12:30:06

微服務(wù)架構(gòu)管理
點贊
收藏

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