java compile handle lambda steps:
1.把lambda body轉為的一個實作方法,用methodhandle 表示這個方法
2.知道将要把lambda轉成哪種function interface,comsumer 還是predict
3.擷取其它中繼資料,例如序列化資訊
4.将要傳入lambda中的值
如下圖,前三個是靜态的,第4個是動态的
2.

上圖中indy是invocatdynamic的縮寫,bootstrap是一個lambda工廠,它決定最終怎樣的政策生成lambda代碼,Predicate是目标類型,lambda$1是方法,
以及參數minage.然後把它扔給list.removeif.整個過程的動态性,展現在lambda的最終代碼(例如是内部類,還是其他政策)是在runtime生成的,從編譯推遲到運作時,
多次調用時,第一次詢問bootstrap以後,後面在類型不變的情況下,就不在詢問bootstrap了。運作時,能夠獲得更多的資訊,但是如果lambda僅僅是一個x->x*2這樣
不用用到自身以外的其他資訊,這在無狀态無屬性的lambda,會直接生成方法調用,不走class路線,sun公司
也會不斷優化政策。例如專門給runnable和compartor指定一種類。
5.lambda的成本組成(最壞相當于内部類,最好相當于直接方法調用)
1)一次性成本-----link成本,class隻需要load一次
2)每個lambda表達式成本---------capture cost, 對于有變化的X以外的變量,每變一次,要調用一次constructor,因為這個變量是innerclass的一個私有屬性,用constructor給它指派。生成instance,然後專心處理X變量。
3)調用lambda内部方法的成本,跟普通方法調用一樣