Groovy入門篇--Code as data, or closures
Posted on 2007-08-15 22:22 puras 閱讀(1355) 評論(1) 編輯 收藏 所屬分類: Groovy原文件:http://groovy.codehaus.org/Tutorial+2+-+Code+as+data%2C+or+closures
譯者:puras
1.閉包
有一件事讓Groovy與其他大多數(shù)的編譯語言不同,就是你可以為第一類對象創(chuàng)建方法.你可以定義一個代碼塊,并像字符串或整數(shù)一下賦給它.查看下面的代碼:
square = { it * it }
在大括號中的表達(dá)式"it * it"告訴Groovy編譯器將表達(dá)式看成一段代碼.在軟件世界中,稱之為"閉包".在這個例子中,"it"是提供給方法的值的引用.之后編譯后的方法像上面一樣賦給變量"square".所以,現(xiàn)在我們可以像這樣來做些事:
square(9)
得到的值為81.
這不是非常有趣的,直到我們發(fā)現(xiàn)我們可以為"square"方法傳一些值.這有一些內(nèi)建的方法為這個方法提供一個參數(shù).一個例子就是數(shù)組的"collect"方法.嘗試這樣做:
[ 1, 2, 3, 4 ].collect(square)
這個表達(dá)式說,使用值1, 2, 3和4創(chuàng)建一個數(shù)組,之后調(diào)用"collect"方法,將我們上面定義的閉包傳進(jìn)去.執(zhí)行這個"collect"方法遍歷數(shù)組中的每一個條目,在這些條目上調(diào)用這個閉包,之后將結(jié)果放到一個新的數(shù)組里,結(jié)果為:
[ 1, 4, 9, 16 ]
對于多數(shù)的方法,你可以當(dāng)作參數(shù)一樣調(diào)用閉包,查看Groovy GDK documentation.
默認(rèn)的,閉包將一個參數(shù)稱為"it",你同樣可以使用名字參數(shù)來創(chuàng)建閉包.例如Map.each()方法,可以為閉包提供兩個變量,將它們分別綁定到Key和關(guān)聯(lián)的值上:
printMapClosure = { key, value -> println key + "=" + value } [ "yue" : "wu", "lane" : "burks", "sudha" : "saseethiaseeleethialeselan" ].each(printMapClosure)
結(jié)果:
yue=wu lane=burks sudha=saseethiaseeleethialeselan
2.閉包的例子
這里有一些閉包的例子.第一個展示了兩件事.第一,閉包與它自己之外的變量相結(jié)合.更確切的說,這個閉包的目的是將數(shù)組orderParts中存儲的各部分,有序的結(jié)合到一起,添加(或附加)給變量fullString.變量fullString沒有在閉包中.第二件事是這個例子中不同的是閉包是"匿名"的,意思是它不需要提供一個名字,并且在each方法中指定的地方被調(diào)用.
fullString = "" orderParts = ["BUY", 200, "Hot Dogs", "1"] orderParts.each { fullString += it + " " } println fullString
你或許能猜到它輸出的是什么.
下一個例子是另一個匿名閉包,這里,將計算存儲中Map中的值.
myMap = ["asdf": 1 , "qwer" : 2, "sdfg" : 10] result = 0 myMap.keySet().each( { result+= myMap[it] } ) println result
3.文件處理
從文件中讀取數(shù)據(jù),是非常簡單的.首先創(chuàng)建一個文本文件,并將其命名為"myfile.txt".它意味著什么并不要緊,隨便的輸入一些文字,并把它保存在你的C盤下的temp目錄里.之后在groovyConsole里輸入下面的代碼:
yFileDirectory = "C:\\temp\\" myFileName = "myfile.txt" myFile = new File(myFileDirectory + myFileName) printFileLine = { println "File line: " + it } myFile.eachLine( printFileLine )
這將會輸入文件中的每一行,以"File line"為前綴.第一二行代碼簡單的定義指定文件所在位置的變量.變量名稱不具有什么特殊意義,并且與你可以看到的一樣, 我們在使用它們的時候?qū)⑺鼈兘Y(jié)合到一起.因為在Groovy中反斜杠字符有特殊的意義,你需要使用兩個來告訴它你真正想要的是反斜杠.
以"myFile = "開始的下一行,創(chuàng)建了一個新的文件對象.一個對象是有關(guān)聯(lián)的方法和數(shù)據(jù)的集合.例如,一個文件對象可以有它自己位置的描述數(shù)據(jù),在這個例子中的"C:\temp\myfile.txt",并且可能有一個方法,在文件存在的時候刪除它.在這個例子中我們只使用了"eachLine"方法,我們在代碼的最后一行調(diào)用的.之前的一行是一個簡單閉包的定義,你應(yīng)該已經(jīng)見過幾次了.
4.字符串處理
Groovy中的字符串,與Java中的字符串具有相同的功能.也就是說,一個Groovy的字符串,僅僅是一個Java字符串同一些額外添加的東西.因為這些,我們可以通過查閱
這段代碼匯集了我們之前說過的一些事情.這里有兩件新的事情,第一是在一個字符串上使用split方法.第二個是在字符串上調(diào)用toInteger().調(diào)用toInteger()簡單的告訴Groovy你想將一個字符串像數(shù)字一樣看街.看看如果你不使用toInteger()運(yùn)行第三行運(yùn)行的代碼會發(fā)生什么. 另一件事情是你可能注意到toInteger不在String的Java文檔中.那是因為它是在Groovy的String上的一個擴(kuò)展的特征.你同樣可以查看Groovy擴(kuò)展Java對像的文檔.stringDate = "2005-07-04"
dateArray = stringDate.split("-")
year = dateArray[0].toInteger()
year = year + 1
newDate = year + "-" + dateArray[1] + "-" + dateArray[2]