鍍金池/ 教程/ Android/ Groovy 中的數(shù)據(jù)類型
Groovy 介紹
腳本類、文件 I/O 和 XML 操作
更多
一些前提知識(shí)
Gradle 工作流程
基本組件
題外話
總結(jié)
Gradle 編程模型及 API 實(shí)例詳解
閉包
Gradle 介紹
閑言構(gòu)建
Groovy 中的數(shù)據(jù)類型

Groovy 中的數(shù)據(jù)類型

Groovy 中的數(shù)據(jù)類型

Groovy 中的數(shù)據(jù)類型我們就介紹兩種和 Java 不太一樣的:

  • 一個(gè)是 Java 中的基本數(shù)據(jù)類型。

  • 另外一個(gè)是 Groovy 中的容器類。

  • 最后一個(gè)非常重要的是閉包。

放心,這里介紹的東西都很簡(jiǎn)單

基本數(shù)據(jù)類型

作為動(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)單,就三種:

  • List:鏈表,其底層對(duì)應(yīng) Java 中的 List 接口,一般用 ArrayList 作為真正的實(shí)現(xiàn)類。
  • Map:鍵-值表,其底層對(duì)應(yīng) Java 中的 LinkedHashMap。
  • Range:范圍,它其實(shí)是 List 的一種拓展。

對(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 API 的一些秘笈

前面講這些東西,主要是讓大家了解 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è)撊绾胃玫檬褂盟兀?

  • 先定位到 Range 類。它位于 groovy.lang 包中:

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ù)。

上一篇:更多