2 回答

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
Lambda 表達(dá)式不同于碰巧實(shí)現(xiàn)函數(shù)式接口的匿名內(nèi)部類。
匿名內(nèi)部類將在編譯時(shí)創(chuàng)建自己的類文件Foo$1.class
,如果它包含在Foo
類中,通常類似于 。它是實(shí)現(xiàn)接口或子類的全功能類。要在其范圍之外引用本地值,它將在幕后在匿名內(nèi)部類中創(chuàng)建一個(gè)實(shí)例變量,該變量表示該值的副本。這就是為什么變量必須是有效的最終變量——否則實(shí)際變量可能會(huì)改變并且副本可能是陳舊的。
Lambda 表達(dá)式不創(chuàng)建匿名內(nèi)部類。他們使用 ajava.lang.invoke.LambdaMetafactory
來生成 a CallSite
,稍后可以使用它來執(zhí)行 lambda 表達(dá)式。lambda 表達(dá)式,無論是塊還是表達(dá)式,都被轉(zhuǎn)換為包含它的類中的隱藏私有靜態(tài)方法。不是創(chuàng)建具有隱藏變量的類,而是將捕獲的值轉(zhuǎn)換為隱藏的私有靜態(tài)方法的參數(shù)。局部值仍然必須是有效的最終值,因?yàn)閭鬟f給方法的值又是一個(gè)副本。invokedynamic
該方法由JVM 中的指令調(diào)用。

TA貢獻(xiàn)1911條經(jīng)驗(yàn) 獲得超7個(gè)贊
是的,它們是不同的。
Lambda 實(shí)際上并不一定要?jiǎng)?chuàng)建匿名類——它們當(dāng)然不只是被翻譯成等效的匿名類。它們的創(chuàng)建比這要復(fù)雜得多,并且通常以在運(yùn)行時(shí)創(chuàng)建的匿名類結(jié)束,但不一定。
Lambda 不捕獲除了其中特別提到的變量之外的任何內(nèi)容,這與匿名內(nèi)部類不同,如果它們是在實(shí)例方法中定義的,則會(huì)捕獲封閉的類對(duì)象。
添加回答
舉報(bào)