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

全部開發(fā)者教程

Lambda 表達式

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

1. 什么是 Lambda 表達式

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

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

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

2. 為什么需要 Lambda 表達式

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

實例演示
預覽 復制
復制成功!
public class LambdaDemo1 {

    public static void main(String[] args) {

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

}
運行案例 點擊 "運行案例" 可查看在線運行效果

運行結果:

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

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

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

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

修改后實例如下:

實例演示
預覽 復制
復制成功!
public class LambdaDemo1 {

    public static void main(String[] args) {

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

}
運行案例 點擊 "運行案例" 可查看在線運行效果

運行結果:

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

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

3. 基礎語法

Lambda 表達式由三個部分組成:

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

4. 使用實例

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

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

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

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

實例演示
預覽 復制
復制成功!
public class LambdaDemo2 {

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

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

}
運行案例 點擊 "運行案例" 可查看在線運行效果

運行結果:

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

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

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

實例演示
預覽 復制
復制成功!
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("你好,世界!");
    }

}
運行案例 點擊 "運行案例" 可查看在線運行效果

運行結果:

Hello World!
你好,世界!

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

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

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

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

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

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

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

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

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

4.5 省略 return 和大括號

Lambda 表達式體只有一條語句時,如果有返回,則 return 和大括號都可以省略,實例代碼如下:

實例演示
預覽 復制
復制成功!
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));

    }
}
運行案例 點擊 "運行案例" 可查看在線運行效果

運行結果:

0
-1

5. 小結

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

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