介紹
Gradle 是android studio帶的一款構(gòu)建工具,方便、實(shí)用,一大堆的好話就不說(shuō)了。
如果要熟練使用gradle的話 就要會(huì)使用Groovy腳本語(yǔ)言,Groovy由于它基于Java,所以我們僅介紹Java之外的東西。了解Groovy語(yǔ)言是掌握Gradle的基礎(chǔ)。
Groovy
簡(jiǎn)介
Groovy是一種動(dòng)態(tài)語(yǔ)言,它和Java一樣,也運(yùn)行于Java虛擬機(jī)中,你也可以認(rèn)為groovy是擴(kuò)展了java語(yǔ)言,Groovy對(duì)自己的定義就是:*Groovy是在 java平臺(tái)上的、 具有像Python, Ruby 和 Smalltalk 語(yǔ)言特性的靈活動(dòng)態(tài)語(yǔ)言, Groovy保證了這些特性像 Java語(yǔ)法一樣被 Java開(kāi)發(fā)者使用。執(zhí)行Groovy腳本時(shí),Groovy會(huì)先將其編譯成Java類字節(jié)碼,然后通過(guò)Jvm來(lái)執(zhí)行這個(gè)Java類。
Groovy 基本語(yǔ)法知識(shí)
學(xué)習(xí)過(guò)swift的應(yīng)該對(duì)下面的語(yǔ)法知識(shí)會(huì)會(huì)覺(jué)得很相識(shí),所謂天下的語(yǔ)言都是一家,一脈相傳,然后各自發(fā)揮。所以還是寫(xiě)一下加深印象。
- Groovy的注釋標(biāo)記和java一樣,用 //或者/**/ 來(lái)表示;
- Groovy 的語(yǔ)句可以不用分號(hào)來(lái)結(jié)尾;
- Groovy 支持動(dòng)態(tài)類型,也就是你在定義變量的時(shí)候可以不用指定他的數(shù)據(jù)類型,可以用關(guān)鍵字def,雖然def 不是必須的,但是為了代碼清晰建議是加上這個(gè)關(guān)鍵字
def var = 1 //可以不用分號(hào), 也可以不用指定類型
def var = "hello"
def int x = 10 //當(dāng)然你也可以直接指定類型
- 函數(shù)定義的時(shí)候,可以不指定函數(shù)的參數(shù)類型;
String testFunction(arg1,arg2){//無(wú)需指定參數(shù)類型
...
}
- 函數(shù)的返回值也可以是無(wú)類型的,但需要使用def 關(guān)鍵字,最后會(huì)根據(jù)最后一行的代碼的執(zhí)行值 作為函數(shù)的返回類型;
//無(wú)類型的函數(shù)定義,必須使用def關(guān)鍵字
def nonReturnTypeFunc(){
last_line //最后一行代碼的執(zhí)行結(jié)果就是本函數(shù)的返回值
}
//如果指定了函數(shù)返回類型,則可不必加def關(guān)鍵字來(lái)定義函數(shù)
String getString(){
return"I am a string"
}
- 單引號(hào)' ',,對(duì)應(yīng)java中的字符串,不會(huì)轉(zhuǎn)義字符串中的內(nèi)容,比如:
//不對(duì)$符號(hào)進(jìn)行轉(zhuǎn)義
defsingleQuote='I am $ dolloar' //輸出就是I am $ dolloar
- 雙引號(hào):雙引號(hào)就會(huì)執(zhí)行轉(zhuǎn)義,當(dāng)字符串中出現(xiàn)$時(shí)會(huì)先去$表達(dá)式再求值
defdoubleQuoteWithoutDollar = "I am one dollar" //輸出 I am one dollar
def x = 1
defdoubleQuoteWithDollar = "I am $x dolloar" //輸出I am 1 dolloar
- 三個(gè)引號(hào):三個(gè)引號(hào)的字符串支持隨意換行,
- 除了每行代碼不用加分號(hào)外,Groovy中函數(shù)調(diào)用的時(shí)候還可以不加括號(hào)
println("test") ---> println"test"
Groovy的數(shù)據(jù)類型
- 一個(gè)是Java中的基本數(shù)據(jù)類型。
- 另外一個(gè)是Groovy中的容器類。
- 最后一個(gè)非常重要的是閉包。
基本數(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.
容器
Groovy容器支持3種分別是Map、List、Range.
- 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
那么去到的 aList[100] 就是等于 100 ,
aList到現(xiàn)在為止有多少個(gè)元素呢?
println aList.size ===>結(jié)果是101
- Map: 我們知道m(xù)ap都是以鍵值對(duì)的形式出現(xiàn)的,key:value,下面看看在groovy中怎樣的,
變量定義:Map變量由[:]定義,比如 def aMap = ['key1':'value1','key2':true] //單引號(hào)表示字符 還記得吧。
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"
但是如果你的key的值 是在你定義map之前就要用()包括起來(lái), 比如下面
def key1="wowo"
def aConfusedMap=[key1:"who am i?"] //這個(gè)時(shí)候 就會(huì)出現(xiàn) aConfusedMap的key值是 key1 而不是wowo,所以這個(gè)時(shí)候的正確寫(xiě)法應(yīng)該是:
def aConfusedMap=[(key1):"who am i?"]
- 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 //從哪個(gè)數(shù)開(kāi)始
println aRange.to //從哪個(gè)數(shù)結(jié)束
- 閉包 :(這不是OC上面我們就用過(guò)的block嘛,只是在java當(dāng)中我們沒(méi)有用過(guò)而已),
閉包英文Closure,是Groovy中非常重要的一個(gè)數(shù)據(jù)類型或者說(shuō)一種概念了。閉包的歷史來(lái)源,種種好處我就不說(shuō)了。我們直接看怎么使用它!
閉包,是一種數(shù)據(jù)類型,它代表了一段可執(zhí)行的代碼。其外形如下:
Stringparam1, int param2 -> //這個(gè)箭頭很關(guān)鍵。箭頭前面是參數(shù)定義,箭頭后面是代碼
println"this is code" //這是代碼,最后一句是返回值,
//也可以使用return,和Groovy中普通函數(shù)一樣
}
Closure的定義格式是:
def xxx = {paramters -> code} 或
def xxx = {無(wú)參數(shù),純code} 這種方式不需要->符號(hào)
調(diào)用閉包的方法:
- aClosure.call("this is string",100)
或 - aClosure("this is string", 100)
上面是閉包的定義和使用,同時(shí)需要注意的一點(diǎn)是,如果閉包沒(méi)有定義參數(shù)的話,它默認(rèn)是隱藏了一個(gè)參數(shù)名字為it ,就像this的作用類似,it 代表閉包的參數(shù)。看例子,
def greeting = { "Hello, $it!" }
greeting('Patrick') 執(zhí)行結(jié)果是 'Hello, Patrick!'
上面的寫(xiě)法等同于
def greeting = { it -> "Hello, $it!" }
但是,如果在閉包定義時(shí),采用下面這種寫(xiě)法,則表示閉包沒(méi)有參數(shù)!
def noParamClosure = { -> true }
這個(gè)時(shí)候,我們就不能給noParamClosure傳參數(shù)了!
noParamClosure ("test") <==會(huì)報(bào)錯(cuò)的!
閉包使用過(guò)程中的注意點(diǎn)
- 省略圓括號(hào),當(dāng)函數(shù)的最后一個(gè)參數(shù)是閉包的話,可以省略圓括號(hào)
def testClosure(int a1,String b1, Closure closure){
//dosomething
closure() //調(diào)用閉包
}
那么調(diào)用的時(shí)候,就可以免括號(hào)!
testClosure (4, "test", {
println"i am in closure"
} )
在Gradle中經(jīng)常會(huì)出現(xiàn)這樣的代碼
task hello {
doLast{
printIn 'hello world'
}
}```
基本上面介紹的是一些基礎(chǔ)的簡(jiǎn)單知識(shí),很多內(nèi)容還需要在后面學(xué)習(xí)和使用中總結(jié)。