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)度排序:
List
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ě)成下面的樣子:
List
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í)。