西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開發(fā)java → Java中的SAMbdas

Java中的SAMbdas

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:本站整理時(shí)間:2010/7/30 17:42:48字體大。A-A+

作者:佚名點(diǎn)擊:21次評(píng)論:0次標(biāo)簽: Java

  • 類型:行業(yè)軟件大。7.3M語(yǔ)言:中文 評(píng)分:10.0
  • 標(biāo)簽:
立即下載

最初的Lambda語(yǔ)法飽受詬病,但實(shí)際上,問(wèn)題的嚴(yán)重性遠(yuǎn)不止純粹的語(yǔ)法那么簡(jiǎn)單(畢竟,語(yǔ)法只不過(guò)是個(gè)外表而已)。其中一個(gè)主要的問(wèn)題是Java并沒有對(duì)函數(shù)類型提供直接的支持,這給Java類型系統(tǒng)帶來(lái)了一些問(wèn)題(函數(shù)數(shù)組可能引起異常泄漏)。無(wú)論能否克服這些問(wèn)題(或者說(shuō)在給定的JDK 7延期發(fā)布的時(shí)間內(nèi)),Lambda都不會(huì)再涉及函數(shù)類型了。

我們可以采用適配的方式簡(jiǎn)化內(nèi)部類的編寫過(guò)程。這些類叫做SAM(即Single Abstract Method)類。它代表了Java語(yǔ)言中抽象類與接口的一個(gè)重要子集,僅包含一個(gè)抽象方法。比如說(shuō),Runnable接口的run()方法、Comparator接口的compare()方法等(只包含一個(gè)抽象方法的抽象類也是可以的,比如Eclipse的org.eclipse.core.runtime.jobs.Job)。

目前進(jìn)行中的規(guī)范表明下面兩種表達(dá)方式是等價(jià)的:

Collections.sort(list,new Comparator() {
public int compare(Object o1, Object o2) {
return(o1.toString().length() - o2.toString().length());
}
}
// is the same as
Collections.sort(list,
{ Object o1, Object o2 -> o1.toString().length() - o2.toString().length() }
);
不得不說(shuō)的是,Lambda語(yǔ)法依然處于提案階段,未來(lái)可能會(huì)發(fā)生變化,但基本想法是在Lambda項(xiàng)目的幫助下,我們可以更加簡(jiǎn)潔的方式編寫內(nèi)部類,從而拋棄現(xiàn)在所用的匿名類方式。另外,Lambda會(huì)保持與內(nèi)部類一樣的表現(xiàn)力,可以從局部堆中獲取狀態(tài)(但堆是否要保持可變的狀態(tài)依然是人們爭(zhēng)論的熱門話題)。然而,語(yǔ)言本身的一些變化(比如說(shuō)可以高效獲取final變量)以及類型與方法/異常推斷的能力使得Lambda要比相應(yīng)的匿名類更加簡(jiǎn)潔。

之所以采取這種方式,一個(gè)原因就是可以不必修改現(xiàn)有的類(主要是 java.util包中的集合類)。假如使用了函數(shù)類型方式,那么就必須得修改集合類以適應(yīng)Lambda,或者是在JDK 7中放棄對(duì)Lambda的支持。其他程序庫(kù)可能比較靈活,但整個(gè)Java類庫(kù)并非這么容易修改,這也解釋了為什么要采取其他方式。

還可以使用方法引用來(lái)代替SAMbda。如下代碼所示:

public class Comparisons {
public static int compareLength(Object o1, Object o2) {
return(o1.toString().length() - o2.toString().length());
}
public static int compareHash(Object o1, Object o2) {
return(o1.hashCode() - o2.hashCode());
}
}
// examples
Collections.sort(list,#Comparisons.compareLength);
Collections.sort(list,#Comparisons.compareHash);
#代表方法句柄,類似于java.lang.reflect.Method。然而,與Method不同的是,他們是在編譯期(而非運(yùn)行期)確定的,JVM的JIT可以自動(dòng)內(nèi)聯(lián)方法引用。這么做還具有其他優(yōu)化效果,比如說(shuō)針對(duì)給定的SAM類型,可以單獨(dú)創(chuàng)建一個(gè)類表示代理的方法句柄而不必在使用時(shí)創(chuàng)建新的匿名類。

最后,還是存在一些有爭(zhēng)議的問(wèn)題。目前規(guī)范的最初草案禁止使用break和continue,但后來(lái)澄清說(shuō)這么做的目的是為了防止跳出SAMBda而進(jìn)入到封閉的范圍內(nèi)。另外一個(gè)主要的變化是return變成隱式的了,不允許在Lambda內(nèi)部使用;但替代的關(guān)鍵字yield(不要與Thread.yield()混為一談)與內(nèi)部類中的return具有相同的語(yǔ)義。表面上來(lái)看,這么做可以實(shí)現(xiàn)在方法調(diào)用后,使用Lambda觸發(fā)方法中的return的效果(即所謂的“long return”)。未來(lái)在語(yǔ)法上也會(huì)有一些變化,可以在Lambda中使用return,這需要使用新的關(guān)鍵字(或是關(guān)鍵字組合,比如long return)。其他相似之處還有使用this引用封閉的SAM實(shí)例,使用Outer.this引用封閉類的實(shí)例。

雖說(shuō)使用Lambda替換SAM這個(gè)決定不如項(xiàng)目最初的提案那樣雄心勃勃,但還是有不少優(yōu)勢(shì)的:實(shí)現(xiàn)簡(jiǎn)單、無(wú)需修改現(xiàn)有的集合類、能夠很快派上用場(chǎng)(不管使用何種方式,只要增加函數(shù)類型就需要修改集合類)。未來(lái),還可以使用相同的Lambda語(yǔ)法創(chuàng)建函數(shù)引用,但其目標(biāo)是今后發(fā)布的JDK版本。

    PPT圖表
    (111)PPT圖表
    我們?cè)谥谱鞲黝惖臅r(shí)候,或多或少的都能用到圖表。圖表它可以直觀的展示出各種信息數(shù)據(jù),有了圖表你就可以很好的將數(shù)據(jù)更直觀準(zhǔn)確的表達(dá)出來(lái)。小編在這里為大家搜集整理了一些大家可能會(huì)用到的圖表模板,歡迎有需要的各位前來(lái)下載。...更多>>

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)