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

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

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

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

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

  • 另外一個是 Groovy 中的容器類。

  • 最后一個非常重要的是閉包。

放心,這里介紹的東西都很簡單

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

作為動態(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 中的容器類很簡單,就三種:

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

對容器而言,我們最重要的是了解它們的用法。下面是一些簡單的例子:

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

前面講這些東西,主要是讓大家了解 Groovy 的語法。實際上在 coding 的時候,是離不開 SDK 的。由于 Groovy 是動態(tài)語言,所以要使用它的 SDK 也需要掌握一些小訣竅。

Groovy 的 API 文檔位于 http://www.groovy-lang.org/api.html

以上文介紹的 Range 為例,我們該如何更好得使用它呢?

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

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

上一篇:更多