2 回答
TA貢獻1951條經(jīng)驗 獲得超3個贊
Lambda 表達式不同于碰巧實現(xiàn)函數(shù)式接口的匿名內(nèi)部類。
匿名內(nèi)部類將在編譯時創(chuàng)建自己的類文件Foo$1.class,如果它包含在Foo類中,通常類似于 。它是實現(xiàn)接口或子類的全功能類。要在其范圍之外引用本地值,它將在幕后在匿名內(nèi)部類中創(chuàng)建一個實例變量,該變量表示該值的副本。這就是為什么變量必須是有效的最終變量——否則實際變量可能會改變并且副本可能是陳舊的。
Lambda 表達式不創(chuàng)建匿名內(nèi)部類。他們使用 ajava.lang.invoke.LambdaMetafactory來生成 a CallSite,稍后可以使用它來執(zhí)行 lambda 表達式。lambda 表達式,無論是塊還是表達式,都被轉(zhuǎn)換為包含它的類中的隱藏私有靜態(tài)方法。不是創(chuàng)建具有隱藏變量的類,而是將捕獲的值轉(zhuǎn)換為隱藏的私有靜態(tài)方法的參數(shù)。局部值仍然必須是有效的最終值,因為傳遞給方法的值又是一個副本。invokedynamic該方法由JVM 中的指令調(diào)用。
TA貢獻1911條經(jīng)驗 獲得超7個贊
是的,它們是不同的。
Lambda 實際上并不一定要創(chuàng)建匿名類——它們當(dāng)然不只是被翻譯成等效的匿名類。它們的創(chuàng)建比這要復(fù)雜得多,并且通常以在運行時創(chuàng)建的匿名類結(jié)束,但不一定。
Lambda 不捕獲除了其中特別提到的變量之外的任何內(nèi)容,這與匿名內(nèi)部類不同,如果它們是在實例方法中定義的,則會捕獲封閉的類對象。
添加回答
舉報
