中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Lambda表達(dá)式的意義

2018-07-20    來(lái)源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

Lambda表達(dá)式又稱(chēng)為閉包或匿名方法,形式如下:

(int x, int y) -> x-y;

( ) -> 2;

(String s) -> { System.out.println(s); };

第一個(gè)lambda表達(dá)式接收x和y這兩個(gè)整形參數(shù)并返回它們的差;第二個(gè)lambda表達(dá)式不接收任何參數(shù),直接返回整數(shù)2;第三個(gè)lambda表達(dá)式接收一個(gè)字符串并把它打印到控制臺(tái)。

從上面的例子看,lambda表達(dá)式的語(yǔ)法結(jié)構(gòu)和函數(shù)幾乎是一樣的,只是沒(méi)有函數(shù)名。它由參數(shù)列表、箭頭符號(hào)和函數(shù)體組成。當(dāng)然函數(shù)體既可以是一個(gè)表達(dá)式,也可以是一個(gè)大括號(hào)包圍的語(yǔ)句塊。

從例子看,Lambda表達(dá)式語(yǔ)法確實(shí)相當(dāng)簡(jiǎn)潔。

那么它的意義何在呢?

Lambda表達(dá)式的意義:

對(duì)程序員來(lái)說(shuō)最直觀的感受就是用Lambda表達(dá)式可以簡(jiǎn)化很多代碼。使用它可以很輕松的將很多行代碼縮減成一行。

而更大的意義是,Lambda表達(dá)式對(duì)java性能的提升。

要理解Lambda的意義就先看看Lambda解決了Java里的什么困惑

在java和android里常會(huì)看到這種回調(diào)接口:

public interface ActionListener{

void actionPerformed(ActionEvent e);

}

使用的時(shí)候,要么我們定義一個(gè)類(lèi)來(lái)實(shí)現(xiàn)ActionListener接口,要么使用匿名內(nèi)部類(lèi)。

button.addActionListener(new ActionListener(){ 

public void actionPerformed(ActionEvent e) {

ShowDialog(e.tostring());

}

})

放個(gè)概念:函數(shù)式接口:只有一個(gè)方法的接口。大多數(shù)回調(diào)接口都擁有這個(gè)特征:比如Runnable接口和Comparator接口。

這個(gè)ActionListener回調(diào)接口例子里的五行代碼中僅有一行在做實(shí)際工作。冗余代碼太多,是寫(xiě)代碼層面直觀的效率感受。

同時(shí),這種通過(guò)匿名內(nèi)部類(lèi)的方式也不是一個(gè)好的方案。匿名內(nèi)部類(lèi)存在著影響應(yīng)用性能的問(wèn)題。

對(duì)于匿名內(nèi)部類(lèi),編譯器會(huì)為每一個(gè)匿名內(nèi)部類(lèi)創(chuàng)建相應(yīng)的類(lèi)文件。一般的程序,往往回調(diào)接口會(huì)有很多。這樣就會(huì)生成很多的類(lèi)文件,因?yàn)轭?lèi)在使用之前需要加載類(lèi)文件并進(jìn)行驗(yàn)證,這個(gè)過(guò)程就會(huì)影響應(yīng)用的性能。

然后,java就引入Lambda表達(dá)式了。上面那個(gè)例子,用Lambda表達(dá)式后變成如下:

button.addActionListener((ActionEvent e) -> ShowDialog(e.tostring()));

明顯代碼簡(jiǎn)潔很多。

在這種情況下,編譯器會(huì)負(fù)責(zé)推導(dǎo)這個(gè)lambda表達(dá)式具體是對(duì)應(yīng)哪個(gè)函數(shù)式接口類(lèi)型。注意:lambda表達(dá)式只能出現(xiàn)在目標(biāo)類(lèi)型為函數(shù)式接口的上下文中。

這是Lambda表達(dá)式在代碼簡(jiǎn)潔方面的意義。

在效率提升方面的意義是通過(guò)把函數(shù)式接口的匿名內(nèi)部類(lèi)方法的調(diào)用改成類(lèi)靜態(tài)方法調(diào)用來(lái)完成的。

編譯器在將Lambda表達(dá)式轉(zhuǎn)成函數(shù)式接口實(shí)例時(shí),分析這個(gè)方法體是否需要變量捕獲(Lambda方法體需要訪問(wèn)外部變量時(shí)則為需變量捕獲,反之則為變量不捕獲)。對(duì)于無(wú)需變量捕獲的Lambda,其方法體會(huì)被提取到一個(gè)靜態(tài)方法中,這個(gè)靜態(tài)方法和Lambda表達(dá)式位于同一個(gè)類(lèi)中。對(duì)于需要變量捕獲的Lambda表達(dá)式情況有點(diǎn)復(fù)雜,最后也會(huì)把Lambda表達(dá)式提取到一個(gè)靜態(tài)方法中。也就是Lambda表達(dá)式雖然推導(dǎo)到相應(yīng)的函數(shù)式接口,但并沒(méi)有編譯成匿名內(nèi)部類(lèi)的方式來(lái)處理,而做成是直接方法調(diào)用。

然后就是,在大多數(shù)情況下,Lambda表達(dá)式要比匿名內(nèi)部類(lèi)性能更優(yōu)。

標(biāo)簽: 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:AlphaGo的新技能學(xué)習(xí)過(guò)程

下一篇:iOS 內(nèi)存管理