1. 前言
Gradle系列已完成,專(zhuān)注于Gradle,有如下幾篇文章
- Gradle系列(一) Groovy 基礎(chǔ)
- Gradle系列(二) Gradle執(zhí)行順序和task
- Gradle系列(三) Gradle配置構(gòu)建和渠道包
- Gradle系列(四) Gradle插件
2. 什么是Groovy
在學(xué)習(xí)Gradle之前,需要簡(jiǎn)單普及一下Groovy的語(yǔ)言基礎(chǔ).Groovy是一門(mén)jvm語(yǔ)言,特定領(lǐng)域的語(yǔ)言,里面的水特別深.我們不需要全部記住和掌握,只需要記得一些常用的,不清楚的立刻去查API 文檔.
因?yàn)槟壳癆ndroid的主流構(gòu)建工具是用的Gradle,而Gradle使用時(shí)就需要用到Groovy,還有Gradle DSL和Android DSL.Gradle里面其實(shí)東西比較多.隨便說(shuō)幾個(gè),比如渠道包(差異包),AOP,插樁,熱修復(fù),插件化等等,都需要用到Gradle.所以我們Android開(kāi)發(fā)人員對(duì)于Gradle的需求非常大.有必要搞清楚.
3. 簡(jiǎn)單使用Groovy
打開(kāi)Android Studio,隨便新建一個(gè)Android項(xiàng)目.點(diǎn)擊頂部Tools->Groovy Console即可,這時(shí)AS會(huì)出來(lái)一個(gè)窗口,專(zhuān)門(mén)拿來(lái)運(yùn)行那種臨時(shí)的Groovy代碼的.因?yàn)槭窃诒镜貓?zhí)行,所以執(zhí)行速度會(huì)非陈嗪穑快.寫(xiě)好代碼后點(diǎn)擊窗口左上角的三角按鈕即可運(yùn)行代碼.
4. 語(yǔ)法
droovy的語(yǔ)法比java簡(jiǎn)潔很多
4.1 簡(jiǎn)單示范
int r = 1
def a = 1
a = 'da'
println(a)
def b = "dasa"
def c = 56.4
//調(diào)用下面的test方法
def d = test()
println(d)
def test() {
println("test method")
return 1
}
//輸出
da
test method
1
- groovy中不用寫(xiě)分號(hào)
- 變量類(lèi)型可以省略
- 方法返回類(lèi)型可以省略,上面test方法中的return也可以省略
- 變量類(lèi)型比較弱,可以推斷出來(lái)
- 字符串可以用雙引號(hào)或者單引號(hào)包起來(lái)
4.2 String
def name = "zhangsan"
def b = 2
def test(a, b) {
println("a=${a} b=$嚷缭")
}
test(name, b)
//輸出
a=zhangsan b=2
- String中如果需要使用到變量,則需要使用$和{}關(guān)鍵字,并且需要使用雙引號(hào)的時(shí)候才能這樣用
- 可以看到方法的入?yún)⒛抢镆部梢允÷灶?lèi)型
- Java中String有的方法,它都有
4.3 閉包
閉包感覺(jué)有點(diǎn)像kotlin的高階函數(shù)(不知道對(duì)不對(duì)),可以將一個(gè)閉包作為參數(shù)傳入方法,也可以賦值給變量.然后調(diào)用call方法即可調(diào)用閉包.kotlin是調(diào)用invoke.
//定義閉包 閉包的參數(shù)
def closure = { int a, String b ->
println("a=${a} b=$证薇")
//閉包返回值
return a + b
}
//調(diào)用閉包 定義result變量不用寫(xiě)def也可以,666
result = closure.call(1, "name")
println(result)
//輸出
a=1 b=name
1name
- 閉包使用call方法調(diào)起,需要傳入?yún)?shù)
- 閉包定義時(shí)的參數(shù)類(lèi)型是可以省略的
4.4 List
比Java中的更加強(qiáng)大.當(dāng)遇到不會(huì)的方法的時(shí)候去查API文檔,比如下面的示例代碼中的each閉包,你肯定不知道閉包的參數(shù)是什么,這時(shí)我們打開(kāi),List的文檔地址,找到each方法,知道了原來(lái)是遍歷每個(gè)元素,參數(shù)是每個(gè)元素.
//list 可以存放不同的數(shù)據(jù)類(lèi)型
def list = [1, "test", true, 2.3]
list.each { item ->
println(item)
}
list.each {
println(it)
}
//輸出
1
test
true
2.3
- 閉包的參數(shù)只有一個(gè)時(shí)是可以省略的,在里面使用時(shí)用it代替.和kotlin很像.
- list支持
list[1]
這種形式的訪問(wèn)
4.5 Map
//空的map
def map1 = [:]
//
def map = ["id":1, "name":"xfhy"]
map['id'] = 2
println(map['id'])
map.id = "idStr"
println(map.id)
map.each { key, value ->
println("key=${key} value=${value}")
}
map.each { entry ->
println(entry)
}
//輸出
2
idStr
key=id value=idStr
key=name value=xfhy
id=idStr
name=xfhy
- map支持
map['id']
訪問(wèn)和賦值 - 也支持map.id訪問(wèn)和賦值
- each遍歷支持2種閉包,使用方式如上,記不清楚沒(méi)關(guān)系,使用的時(shí)候去查API就行
4.6 IO
groovy的文件操作也是非常非常好使
def file = new File("D:/test.txt")
file.eachLine { line, lineNo ->
println("第${lineNo}行 $line")
}
//輸出
第1行 name
第2行 age
第3行 book
- 非常好用,簡(jiǎn)單直接地讀取文件內(nèi)容
- 其他好用的API,請(qǐng)參閱這里
4.7 類(lèi)
class Book {
String bookName
double price
}
def book = new Book()
book.with {
bookName = '字典'
price = 24.5
}
println(book.bookName)
println(book.price)
book=null
println(book?.price)
//輸出
字典
24.5
null
- 使用with操作符,可以對(duì)book對(duì)象內(nèi)部屬性進(jìn)行操作,調(diào)用方法等
- 使用?可以避免空指針,免得判空.就像kotlin一樣,很棒.
5. 總結(jié)
我個(gè)人認(rèn)為,基礎(chǔ)掌握差不多這么多就行了,剩下的遇到了再查官方文檔.