Lambda 表達式簡介


一、什么是 Lambda 表達式

Lambda 表達式,也可稱為閉包,它是推動 Java 8 發布的最重要新特性,Lambda 允許把函數作為一個方法的參數(函數作為參數傳遞進方法中).使用 Lambda 表達式可以使代碼變的更加簡潔緊湊

 

二、使用 Lambda 有什么好處

開啟線程執行任務調度

public class LambdaDemo {
    public static void main(String[] args) {
        // 方式一、使用匿名內部類
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("開啟線程執行任務調度...");
            }
        });

        // 方式二、使用 lambda 表達式
        Thread therad2 = new Thread(() -> System.out.println("開啟線程執行任務調度..."));
    }
}

可以從上面的例子中看出,相比於使用匿名內部類,Lambda 表達式更加簡潔

 

三、Lambda 表達式語法格式

(參數類型1 參數1,參數類型2 參數2) -> {
	語句1;
	語句2;
        [return 語句];
}

1、參數類型可寫可不寫,一般情況下是不寫的,Lambda 會根據上下文去推斷參數類型

2、只有一個參數的情況下,() 可以省略不寫

3、Lambda 體中只有一條語句時,{}、return、; 可以省略不寫,注意在省略的時候要么全部不寫,要么全部要寫,不能部分省略

4、Lambda 體中有多條語句時,{} 必須要加上,如果有返回值 return 也必須加上

 

四、函數型接口

使用 Lambda 表達式的前提是需要函數型接口的支持,至於什么是函數型接口可以參考如下文檔

https://www.cnblogs.com/xiaomaomao/p/16459354.html

 

五、匿名內部類、Lambda 表達式原理

1、匿名內部類原理

// 自定義接口
interface Flyable {
    void fly(String userName);
}

public class LambdaDemo {
    public static void main(String[] args) {
        LambdaDemo lambdaDemo = new LambdaDemo();
        lambdaDemo.flying(new Flyable() {
            @Override
            public void fly(String userName) {
                System.out.println(userName + " want to fly");
            }
        });
    }

    public void flying(Flyable flyable) {
        flyable.fly("summer");
    }
}

上面是通過匿名內部類實現的代碼,實際上匿名內部類會在編譯期產生一個中間類,該中間類的偽代碼如下

// LambdaDemo$1 是編譯期產生的中間類名稱,LambdaDemo 是類名,$1 是第 1 個
class LambdaDemo$1 implements Flyable{
    public void fly(String userName) {
        System.out.println(userName + " want to fly");
    }
}

通過 IDEA debug 可以找到該中間類

2、Lambda 表達式原理(實現偽代碼)

public class LambdaDemo {
    public static void main(String[] args) {
        LambdaDemo lambdaDemo = new LambdaDemo();
        lambdaDemo.flying(new Flyable() {
            @Override
            public void fly(String userName) {
                // 匿名內部類中調用生成的 私有靜態 方法
                LambdaDemo.lambda$main$0(userName);
            }
        });
    }

    // Lambda 表達式在運行期會生成一個 私有的靜態方法,該方法的實現就是 Lambda 體的內容
    private static void lambda$main$0(String userName) {
        System.out.println(userName + " want to fly");
    }

    public void flying(Flyable flyable) {
        flyable.fly("summer");
    }
}

Lambda 表達式實現原理

1、在本類中生成一個 私有靜態 方法,該方法的內容就是 Lambda 體中的內容

2、匿名內部類中調用生成的 私有靜態 方法

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM