真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Scala中的Lambda表達(dá)式是什么以及為什么使用Lambda表達(dá)式-創(chuàng)新互聯(lián)

Scala中的Lambda表達(dá)式是什么以及為什么使用Lambda表達(dá)式,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

為衢州等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及衢州網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)、衢州網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

Java8終于要支持Lambda表達(dá)式!自2009年以來(lái)Lambda表達(dá)式已經(jīng)在Lambda項(xiàng)目中被支持。在那時(shí)候,Lambda表達(dá)式仍被稱(chēng)為Java閉包。下面創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,小編來(lái)講解下為什么使用Lambda表達(dá)式?Scala中的Lambda表達(dá)式是什么?

為什么使用Lambda表達(dá)式

Lambda表達(dá)式通常使用在圖形用戶(hù)界面(GUI)的開(kāi)發(fā)中。一般來(lái)說(shuō),GUI編程將程序行為和事件做連接。比如,當(dāng)用戶(hù)按下一個(gè)按鈕(觸發(fā)一個(gè)事件),你的程序就需要去執(zhí)行某些行為,可能是將一些數(shù)據(jù)儲(chǔ)存到一個(gè)數(shù)據(jù)存儲(chǔ)器中。在Swing中,可以使用ActionListener來(lái)實(shí)現(xiàn):

classButtonHandlerimplementsActionListener{

publicvoidactionPerformed(ActionEvente)

{

//dosomething

}

}

classUIBuilder{

publicUIBuilder(){

button.addActionListener(newButtonHandler());

}

}

這個(gè)例子表明了ButtonHandler類(lèi)作為一個(gè)回調(diào)替換的用法。在這里ButtonHandler類(lèi)僅包含ActionListener接口定義的actionPerformed方法。我們可以使用匿名內(nèi)部類(lèi)來(lái)簡(jiǎn)化代碼:

classUIBuilder{

publicUIBuilder(){

button.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEventevent){

//dosomething

}

})

}

}

這樣代碼簡(jiǎn)潔多了。更仔細(xì)的去看代碼時(shí),就會(huì)發(fā)現(xiàn)我們還創(chuàng)建一個(gè)只生成一個(gè)實(shí)例的類(lèi),而這個(gè)實(shí)例也僅僅持有一個(gè)獨(dú)立的方法。這恰好是Lambda表達(dá)式所能解決的其中一類(lèi)問(wèn)題。

Lambda表達(dá)式代替函數(shù)

一個(gè)lambda表達(dá)式從字面上講就是一個(gè)函數(shù)。它定義了一個(gè)函數(shù)的輸入?yún)?shù)和函數(shù)體。Java8中的,lambda表達(dá)式語(yǔ)法尚未確定,不過(guò)大致應(yīng)該類(lèi)似這個(gè)樣子的:

(typeparameter)->function_body一個(gè)具體的例子:

(Strings1,Strings2)->s1.length()-s2.length();

這個(gè)lambda表達(dá)式用來(lái)計(jì)算兩個(gè)字符串的長(zhǎng)度差。還有一些擴(kuò)展的語(yǔ)法,比如避免參數(shù)的類(lèi)型定義(我們馬上見(jiàn)看到例子)還有使用{和}來(lái)支持多行定義。

Collections.sort()

方法是lambda表達(dá)的理想例子。它允許我們將字符串按照長(zhǎng)度排序:

Listlist=Array.asList("loooooong","short","tiny");

Collections.sort(list,(Strings1,Strings2)->s1.length()-s2.length());

>"tiny","short","loooooong".

所以,不像現(xiàn)在java必須要求的向sort方法輸入一個(gè)已經(jīng)實(shí)現(xiàn)的Comparator(比較器)而是傳送一個(gè)lambda表達(dá)式我們就可以得到相同的結(jié)果。

Lambda表達(dá)式代替閉包

lambda表達(dá)式有許多有趣的特性。其中之一是,它們是閉包。一個(gè)閉包允許函數(shù)訪(fǎng)問(wèn)直接詞法作用域之外的變量。

Stringouter="java8"(Strings1)->s1.length()-outer.length()

在例子中,lambda表達(dá)式訪(fǎng)問(wèn)了字符串outer這個(gè)作用域之外定義的變量。對(duì)于內(nèi)聯(lián)閉包來(lái)說(shuō)這是很難做到的。

Lambda表達(dá)式也支持類(lèi)型推論

類(lèi)型推論是java7引入的但它同樣適用于lambda表達(dá)式。簡(jiǎn)單來(lái)說(shuō),類(lèi)型推論意味著程序員可以在任意一個(gè)編譯器能夠自動(dòng)推斷出類(lèi)型的地方省略類(lèi)型定義。如果類(lèi)型推論能夠應(yīng)用到前面的排序lambda表達(dá)式上,那么它就能寫(xiě)成下面的樣子:

Listlist=Arrays.asList(…);

Collections.sort(list,(s1,s2)->s1.length()-s2.length());

就像你所見(jiàn)到的一樣,參數(shù)s1和s2的類(lèi)型被省略了。因?yàn)榫幾g器知道list是一個(gè)字符串集合,它知道被用來(lái)作為比較器的lambda表達(dá)式必定是相同的類(lèi)型。因此,這個(gè)類(lèi)型不需要顯式地聲明,即使你有這么做的自由。

類(lèi)型推論的主要優(yōu)勢(shì)就是減少樣板代碼,如果編譯器可以為我們識(shí)別類(lèi)型,為什么我們必須自己定義它們。

珍愛(ài)Lambda表達(dá)式,遠(yuǎn)離匿名內(nèi)部類(lèi)

我們來(lái)體會(huì)下,為何lambda表達(dá)式和類(lèi)型推論有助于簡(jiǎn)化我們前面所提到的回調(diào)例子:

classUIBuilder{

publicUIBuilder(){

button.addActionListener(e->//processActionEvente)

}

}

我們下載直接傳送一個(gè)lambda表達(dá)式進(jìn)入addActionListener方法來(lái)代替前面定義的持有回調(diào)方法的類(lèi)。除了減少模板代碼和提高可讀性以外,它使我們直接表達(dá)我們感興趣的事情:處理事件。

在我們了解lambda表達(dá)式更多優(yōu)勢(shì)之前,先來(lái)看看在Scala中的lambda表達(dá)式副本。

Scala中的Lambda表達(dá)式是什么

在函數(shù)式編程中,函數(shù)是基本的構(gòu)造塊。Scala融合了java中的面向?qū)ο缶幊毯秃瘮?shù)式編程。在Scala中,一個(gè)lambda表達(dá)式是種叫做"函數(shù)"或者"函數(shù)文本".Scala中的函數(shù)屬于一等公民。它們可以被分配給vals或者vars(最終變量或者非最終變量),它們可以作為其他函數(shù)的參數(shù),也可以組合成新的函數(shù)。

在Scala中一個(gè)函數(shù)文本寫(xiě)成如下形式:

(argument)=>//funtionbody

舉例來(lái)說(shuō),前面提到的java用來(lái)計(jì)算兩個(gè)字符串長(zhǎng)度差的lambda表達(dá)式,在Scala中寫(xiě)作如下:

(s1:String,s2:String)=>s1.length-s2.

lengthScala中的函數(shù)文本也是閉包。它可以訪(fǎng)問(wèn)在直接詞法作用域之外定義的變量。

valouter=10valmyFuncLiteral=(y:Int)=>y*outervalresult=myFuncLiteral(2)>20這個(gè)例子結(jié)果是20.

正如你所見(jiàn),我們將函數(shù)文本分配給了變量myFuncLiteral.

java8的lambda表達(dá)式和Scala的函數(shù)文本在語(yǔ)法和語(yǔ)義上的相似性是十分明顯的。從語(yǔ)義上講它們是相同的,而語(yǔ)法上的不同就是箭頭符號(hào)(java8->,scala=>)和我們沒(méi)有提到的簡(jiǎn)化符號(hào)。

關(guān)于Scala中的Lambda表達(dá)式是什么以及為什么使用Lambda表達(dá)式問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


分享標(biāo)題:Scala中的Lambda表達(dá)式是什么以及為什么使用Lambda表達(dá)式-創(chuàng)新互聯(lián)
文章出自:http://weahome.cn/article/ppspd.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部