Groovy 中的數(shù)據(jù)類型我們就介紹兩種和 Java 不太一樣的:
一個(gè)是 Java 中的基本數(shù)據(jù)類型。
另外一個(gè)是 Groovy 中的容器類。
放心,這里介紹的東西都很簡(jiǎn)單
作為動(dòng)態(tài)語(yǔ)言,Groovy 世界中的所有事物都是對(duì)象。所以,int,boolean 這些 Java 中的基本數(shù)據(jù)類型,在 Groovy 代碼中其實(shí)對(duì)應(yīng)的是它們的包裝數(shù)據(jù)類型。比如 int 對(duì)應(yīng)為 Integer,boolean 對(duì)應(yīng)為 Boolean。比如下圖中的代碼執(zhí)行結(jié)果:
http://wiki.jikexueyuan.com/project/deep-android-gradle/images/2.jpg" alt="int 實(shí)際上是 Integer" />
Groovy 中的容器類很簡(jiǎn)單,就三種:
對(duì)容器而言,我們最重要的是了解它們的用法。下面是一些簡(jiǎn)單的例子:
1.List 類
變量定義:List 變量由[]定義,比如
def aList = [5,'string',true] //List 由[]定義,其元素可以是任何對(duì)象
變量存?。嚎梢灾苯油ㄟ^(guò)索引存取,而且不用擔(dān)心索引越界。如果索引超過(guò)當(dāng)前鏈表長(zhǎng)度,List 會(huì)自動(dòng) 往該索引添加元素
assert aList[1] == 'string'
assert aList[5] == null //第 6 個(gè)元素為空
aList[100] = 100 //設(shè)置第 101 個(gè)元素的值為 10
assert aList[100] == 100
那么,aList 到現(xiàn)在為止有多少個(gè)元素呢?
println aList.size ===>結(jié)果是 101
2.Map 類
容器變量定義
變量定義:Map 變量由[:]定義,比如
def aMap = ['key1':'value1','key2':true]
Map 由[:]定義,注意其中的冒號(hào)。冒號(hào)左邊是 key,右邊是 Value。key 必須是字符串,value 可以是任何對(duì)象。另外,key 可以用''或""包起來(lái),也可以不用引號(hào)包起來(lái)。比如
def aNewMap = [key1:"value",key2:true] //其中的 key1 和 key2 默認(rèn)被
處理成字符串"key1"和"key2" 不過(guò) Key 要是不使用引號(hào)包起來(lái)的話,也會(huì)帶來(lái)一定混淆,比如
def key1="wowo"
def aConfusedMap=[key1:"who am i?"]
aConfuseMap 中的 key1 到底是"key1"還是變量 key1 的值“wowo”?顯然,答案是字符串"key1"。如果要是"wowo"的話,則 aConfusedMap 的定義必須設(shè)置成:
def aConfusedMap=[(key1):"who am i?"]
Map 中元素的存取更加方便,它支持多種方法:
println aMap.keyName <==這種表達(dá)方法好像 key 就是 aMap 的一個(gè)成員變量一樣
println aMap['keyName'] <==這種表達(dá)方法更傳統(tǒng)一點(diǎn)
aMap.anotherkey = "i am map" <==為 map 添加新元素
3.Range 類
Range 是 Groovy 對(duì) List 的一種拓展,變量定義和大體的使用方法如下:
def aRange = 1..5 <==Range 類型的變量 由 begin 值+兩個(gè)點(diǎn)+end 值表示
左邊這個(gè) aRange 包含 1,2,3,4,5 這 5 個(gè)值
如果不想包含最后一個(gè)元素,則
def aRangeWithoutEnd = 1..<5 <==包含 1,2,3,4 這 4 個(gè)元素
println aRange.from
println aRange.to
前面講這些東西,主要是讓大家了解 Groovy 的語(yǔ)法。實(shí)際上在 coding 的時(shí)候,是離不開(kāi) SDK 的。由于 Groovy 是動(dòng)態(tài)語(yǔ)言,所以要使用它的 SDK 也需要掌握一些小訣竅。
Groovy 的 API 文檔位于 http://www.groovy-lang.org/api.html
以上文介紹的 Range 為例,我們?cè)撊绾胃玫檬褂盟兀?
http://wiki.jikexueyuan.com/project/deep-android-gradle/images/6.jpg" alt="" />
有了 API 文檔,你就可以放心調(diào)用其中的函數(shù)了。不過(guò),不過(guò),不過(guò):我們剛才代碼中用到了 Range.from/to 屬性值,但翻看 Range API 文檔的時(shí)候,其實(shí)并沒(méi)有這兩個(gè)成員變量。圖 6 是 Range 的方法
http://wiki.jikexueyuan.com/project/deep-android-gradle/images/7.jpg" alt="" />
文檔中并沒(méi)有說(shuō)明 Range 有 from 和 to 這兩個(gè)屬性,但是卻有 getFrom 和 getTo 這兩個(gè)函數(shù)。What happened?原來(lái):
根據(jù) Groovy 的原則,如果一個(gè)類中有名為 xxyyzz 這樣的屬性(其實(shí)就是成員變量),Groovy 會(huì)自動(dòng)為它添加 getXxyyzz 和 setXxyyzz 兩個(gè)函數(shù),用于獲取和設(shè)置 xxyyzz 屬性值。
注意,get 和 set 后第一個(gè)字母是大寫(xiě)的
所以,當(dāng)你看到 Range 中有 getFrom 和 getTo 這兩個(gè)函數(shù)時(shí)候,就得知道潛規(guī)則下,Range 有 from 和 to 這兩個(gè)屬性。當(dāng)然,由于它們不可以被外界設(shè)置,所以沒(méi)有公開(kāi) setFrom 和 setTo 函數(shù)。