第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

全部開發(fā)者教程

Lambda 表達(dá)式

Lambda 表達(dá)式是一個 Java 8 以后開始支持的一個非常優(yōu)雅的新特性,本小節(jié)我們將學(xué)習(xí)什么是 Lambda 表達(dá)式,為什么需要 Lambda 表達(dá)式,Lambda 表達(dá)式的基礎(chǔ)語法,以及 Lambda 表達(dá)式的實(shí)際應(yīng)用等內(nèi)容。

1. 什么是 Lambda 表達(dá)式

Lambda 表達(dá)式基于數(shù)學(xué)中的 λ 演算得名,直接對應(yīng)于其中的 lambda 抽象(lambda abstraction),是一個匿名函數(shù),即沒有函數(shù)名的函數(shù)。

Lambda 表達(dá)式是一個匿名函數(shù),匿名函數(shù)由 LISP 語言在 1958 年首先采用,此后,越來越多的編程語言開始陸續(xù)采用。

我們可以把 Lambda 表達(dá)式理解為是一段可傳遞的代碼(將代碼像數(shù)據(jù)一樣傳遞)。使用它可以寫出簡潔、靈活的代碼。作為一種更緊湊的代碼風(fēng)格,使 Java 語言的表達(dá)能力得到了提升。

2. 為什么需要 Lambda 表達(dá)式

在 Java 8 之前,編寫一個匿名內(nèi)部類的代碼很冗長、可讀性很差,請查看如下實(shí)例:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
public class LambdaDemo1 {

    public static void main(String[] args) {

        // 實(shí)例化一個 Runnable 接口的匿名實(shí)現(xiàn)類對象
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello, 匿名內(nèi)部類");
            }
        };
        // 執(zhí)行匿名內(nèi)部類的 run() 方法
        runnable.run();
    }

}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

Hello, 匿名內(nèi)部類

Lambda 表達(dá)式的應(yīng)用則使代碼變得更加緊湊,可讀性增強(qiáng);另外,Lambda 表達(dá)式使并行操作大集合變得很方便,可以充分發(fā)揮多核 CPU 的優(yōu)勢,更易于為多核處理器編寫代碼。

下面我們使用 Lambda 表達(dá)式改寫上面的代碼。

如果你使用 IDEA 編寫代碼,可以直接一鍵智能修改,首先,將鼠標(biāo)光標(biāo)移動到灰色的 new Runnable() 代碼處,此時會彈出一個提示框,提示可以使用 Lambda 表達(dá)式替換,點(diǎn)擊 Replace with lambda 按鈕即可完成代碼替換,截圖如下:

修改后實(shí)例如下:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
public class LambdaDemo1 {

    public static void main(String[] args) {

        // 實(shí)例化一個 Runnable 接口的匿名實(shí)現(xiàn)類對象
        Runnable runnable = () -> System.out.println("Hello, 匿名內(nèi)部類");
        // 執(zhí)行匿名內(nèi)部類的 run() 方法
        runnable.run();
    }

}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

Hello, 匿名內(nèi)部類

通過對比,使用 lambda 表達(dá)式實(shí)現(xiàn)了與匿名內(nèi)部類同樣的功能,并且僅僅用了一行代碼,代碼變得更加簡潔了。對于這樣的寫法,你可能還非常疑惑,但別擔(dān)心,我們馬上就來詳細(xì)講解基礎(chǔ)語法。

3. 基礎(chǔ)語法

Lambda 表達(dá)式由三個部分組成:

  • 一個括號內(nèi)用逗號分隔的形式參數(shù)列表:實(shí)際上就是接口里面抽象方法的參數(shù);
  • 一個箭頭符號:->,這個箭頭我們又稱為 Lambda 操作符或箭頭操作符;
  • 方法體:可以是表達(dá)式和代碼塊,是重寫的方法的方法體。語法如下:
  1. 方法體為表達(dá)式,該表達(dá)式的值作為返回值返回。
(parameters) -> expression
  1. 方法體為代碼塊,必須用 {} 來包裹起來,且需要一個 return 返回值,但若函數(shù)式接口里面方法返回值是 void,則無需返回值。
(parameters) -> {
    statement1; 
    statement2;
}

4. 使用實(shí)例

通過上面一系列內(nèi)容的學(xué)習(xí),我們可以得出一個結(jié)論:Lambda 表達(dá)式本質(zhì)上就是接口實(shí)現(xiàn)類的對象,它簡化了之前匿名內(nèi)部類的冗長代碼的編寫。

關(guān)于 Lambda 表達(dá)式的具體使用,我們將根據(jù)語法格式分為 5 種展開介紹。

4.1 無參數(shù)無返回值

無參數(shù)無返回值,指的是接口實(shí)現(xiàn)類重寫的方法是無參數(shù)無返回值的,我們一開始提到的 Runnable 接口匿名內(nèi)部類就屬于此類:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
public class LambdaDemo2 {

    public static void main(String[] args) {
        // 通過匿名內(nèi)部類實(shí)例實(shí)例化一個 Runnable 接口的實(shí)現(xiàn)類
        Runnable runnable1 = new Runnable() {
            @Override
            public void run() {  // 方法無形參列表,也無返回值
                System.out.println("Hello, 匿名內(nèi)部類");
            }
        };
        // 執(zhí)行匿名內(nèi)部類的 run() 方法
        runnable1.run();

        // 無參數(shù)無返回值,通過 lambda 表達(dá)式來實(shí)例化 Runnable 接口的實(shí)現(xiàn)類
        Runnable runnable2 = () -> System.out.println("Hello, Lambda");
        // 執(zhí)行通過 lambda 表達(dá)式實(shí)例化的對象下的 run() 方法
        runnable2.run();
    }

}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

Hello, 匿名內(nèi)部類
Hello, Lambda

4.2 單參數(shù)無返回值

無參數(shù)無返回值,指的是接口實(shí)現(xiàn)類重寫的方法是單個參數(shù),返回值為 void 的,實(shí)例如下:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
import java.util.function.Consumer;

public class LambdaDemo3 {

    public static void main(String[] args) {

        // 單參數(shù)無返回值
        Consumer<String> consumer1 = new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        };
        consumer1.accept("Hello World!");

        Consumer<String> consumer2 = (String s) -> {
            System.out.println(s);
        };
        consumer2.accept("你好,世界!");
    }

}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

Hello World!
你好,世界!

4.3 省略數(shù)據(jù)類型

什么叫省略數(shù)據(jù)類型呢?我們依舊采用上面的實(shí)例,使用 Lambda 表達(dá)式可以省略掉括號中的類型,實(shí)例代碼如下:

// 省略類型前代碼
Consumer<String> consumer2 = (String s) -> {
    System.out.println(s);
};
consumer2.accept("你好,世界!");

// 省略類型后代碼
Consumer<String> consumer3 = (s) -> {
    System.out.println(s);
};
consumer3.accept("你好,世界!");

Tips:之所以能夠省略括號中的數(shù)據(jù)類型,是因?yàn)槲覀冊?Comsumer<String> 處已經(jīng)指定了泛型,編譯器可以推斷出類型,后面就不用指定具體類型了。稱為類型推斷。

4.4 省略參數(shù)的小括號

當(dāng)我們寫的 Lambda 表達(dá)式只需要一個參數(shù)時,參數(shù)的小括號就可以省略,改寫上面實(shí)例的代碼:

// 省略小括號前代碼
Consumer<String> consumer3 = (s) -> {
    System.out.println(s);
};
consumer3.accept("你好,世界!");
// 省略小括號后代碼
Consumer<String> consumer4 = s -> {
    System.out.println(s);
};
consumer3.accept("你好,世界!");

觀察實(shí)例代碼,之前的 (s) -> 可以改寫成 s ->,這樣寫也是合法的。

4.5 省略 return 和大括號

當(dāng) Lambda 表達(dá)式體只有一條語句時,如果有返回,則 return 和大括號都可以省略,實(shí)例代碼如下:

實(shí)例演示
預(yù)覽 復(fù)制
復(fù)制成功!
import java.util.Comparator;

public class LambdaDemo4 {

    public static void main(String[] args) {

        // 省略 return 和 {} 前代碼
        Comparator<Integer> comparator1 = (o1, o2) -> {
            return o1.compareTo(o2);
        };
        System.out.println(comparator1.compare(12, 12));

        // 省略 return 和 {} 后代碼
        Comparator<Integer> comparator2 = (o1, o2) -> o1.compareTo(o2);
        System.out.println(comparator2.compare(12, 23));

    }
}
運(yùn)行案例 點(diǎn)擊 "運(yùn)行案例" 可查看在線運(yùn)行效果

運(yùn)行結(jié)果:

0
-1

5. 小結(jié)

通過本小節(jié)的學(xué)習(xí),我們知道了 Lambda 表達(dá)式并不是 Java 所特有的特性,很多主流編程語言都支持 Lambda 表達(dá)式,在 Java 中,Lambda 表達(dá)式實(shí)際上就是接口實(shí)現(xiàn)類的對象,它簡化了之前匿名內(nèi)部類的冗長代碼的編寫。Lambda 表達(dá)式能使代碼變得更加緊湊,增強(qiáng)代碼的可讀性;另外,Lambda 表達(dá)式使并行操作大集合變得很方便,可以充分發(fā)揮多核 CPU 的優(yōu)勢,更易于為多核處理器編寫代碼。

我們也通過大量的實(shí)例代碼介紹了 Lambda 的語法格式和實(shí)際使用,通過這些實(shí)例,可以發(fā)現(xiàn) Lambda 表達(dá)式對于接口也是有要求的 —— 接口內(nèi)部只能包含一個抽象方法,如果接口內(nèi)部包含多個抽象方法,我們就無法使用 Lambda 表達(dá)式了,這樣只包含一個抽象方法的接口,我們稱為函數(shù)式接口,下一小節(jié)我們將詳細(xì)介紹函數(shù)式接口。