lambda 重點高級知識講解3 - 表達式裡面的this

本文由曉風輕編寫,不講解lambda的初級入門知識,只講解lambda中高級的/難的重點知識。

曉風輕:lambda 重點高級知識講解1 - 實例方法的方法引用?

zhuanlan.zhihu.com圖標曉風輕:lambda 重點高級知識講解2 - 級聯表達式和柯里化?

zhuanlan.zhihu.com圖標

lambda表達式中的this

lambda表達式最終會返回一個實現了指定介面的實例,看上去和內部匿名類很像,但有一個最大的區別就是代碼裡面的this,內部匿名類this指向的就是匿名類,而lambda表達式裡面的this指向的當前類。

package jdk8.lambda;/** * lambda表達式的this * * @author 曉風輕 * */public class ThisDemo { private String name = "ThisDemo"; public void test() { // 匿名類實現 new Thread(new Runnable() { private String name = "Runnable"; @Override public void run() { System.out.println("這裡的this指向匿名類:" + this.name); } }).start(); // lambda實現 new Thread(() -> { System.out.println("這裡的this指向當前的ThisDemo類:" + this.name); }).start(); } public static void main(String[] args) { ThisDemo demo = new ThisDemo(); demo.test(); }}

輸出

這裡的this指向匿名類:Runnable這裡的this指向當前的ThisDemo類:ThisDemo

實現原理

lambda表達式裡面,會把lambda表達式在本類中生成一個以lambda$+數字的方法。關鍵點:該方法不一定是static的方法,是static還是非static,取決於lambda表達式裡面是否引用了this。這就是為什麼lambda表達式裡面的this指向的是本地,因為他在本類裡面創建了一個方法,然後把lambda表達式裡面的代碼放進去。

// lambda實現 // 下面會自動生成lambda$0方法,由於使用了this,所以是非static方法 new Thread(() -> { System.out.println("這裡的this指向當前的ThisDemo類:" + this.name); }).start(); // lambda實現 // 下面會自動生成lambda$1方法,由於使用了this,所以是static方法 new Thread(() -> { System.out.println("這裡沒有引用this,生成的lambda1方法是static的"); }).start();

上面代碼會自動生成2個lambda$方法

使用javap -s -p 類名, 可以看出一個是static,一個是非staic的

這就是為什麼lambda表達式裡面的this指向當前類的底層機制!因為代碼就是在本類的一個方法裡面執行的。

額外說一句,自動生成的方法是否帶參數取決於lambda是否有參數,例子中表達式沒有參數(箭頭左邊是空的),所以自動生成的也沒有。


推薦閱讀:

如何看待基於 Atom 和 Lens 的狀態管理工具 Calmm-js 和 Focal?

TAG:Lambda表達式 | 函數式編程 | FunctionalReactiveProgramming |