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