最近打算研究下Android的編譯工具gradle,說(shuō)起來(lái)使用也快2年了债鸡,但是之前文檔啥的都不太多江滨,也沒(méi)啥時(shí)間來(lái)深入研究一下,現(xiàn)在準(zhǔn)備換工作厌均,有時(shí)間了唬滑,來(lái)搞一搞。
首先介紹下groovy----gradle使用的語(yǔ)言棺弊。
groovy其實(shí)是一個(gè)java的簡(jiǎn)化版本晶密,它基于java,并且優(yōu)化了一些java的語(yǔ)法特性模她,開(kāi)發(fā)者可以用腳本語(yǔ)言的形式來(lái)編寫(xiě)代碼稻艰,但是其實(shí)底層還是把groovy編譯成java類(lèi),對(duì)于喜歡使用java且不太會(huì)python等腳本語(yǔ)言的開(kāi)發(fā)者來(lái)說(shuō)侈净,是一個(gè)不錯(cuò)的東西尊勿。
語(yǔ)法簡(jiǎn)介
groovy網(wǎng)站 http://www.groovy-lang.org 僧凤,雖然gradle自帶了編譯器,但是建議想學(xué)習(xí)groovy的同學(xué)們還是下載一個(gè)安裝包元扔,這樣在平時(shí)的工作中也可以使用一下groovy躯保。groovy的語(yǔ)法糖還是很多的,這里主要介紹下我覺(jué)得比較好的地方摇展。
腳本特性
groovy執(zhí)行有多種方式吻氧,可以直接在命令行執(zhí)行,也可以保存為文件(下面例子需要先安裝groovy)
#方式一:
groovy -e "10.times{println('cc')}"
#方式二
groovy MyScript.groovy
#或者
groovy MyScript
#方式三
groovyc MyScript.groovy
java -cp %GROOVY_HOME%/embeddable/groovy-all-2.4.8.jar MyScript
類(lèi)型優(yōu)化
為什么要有類(lèi)型定義咏连?
在 Java 中盯孙,如果要聲明一個(gè) String變量,則必須輸入:
String value = "Hello World";
但是祟滴,如果仔細(xì)想想振惰,就會(huì)看出,等號(hào)右側(cè)的字符已經(jīng)表明 value的類(lèi)型是 String垄懂。所以骑晶,Groovy 允許省略 value前面的 String類(lèi)型變量,并用 def代替草慧。
def value = "Hello World"
除了輸出 value的值桶蛔,還可以用以下調(diào)用輸出它的類(lèi)型:
def message = "Hello World"
println message.class
函數(shù)定義時(shí),參數(shù)的類(lèi)型也可以不指定漫谷。比如
String function(arg1,args2){//無(wú)需指定參數(shù)類(lèi)型
}
除了變量定義可以不指定類(lèi)型外仔雷,Groovy中函數(shù)的返回值也可以是無(wú)類(lèi)型的。比如:
//無(wú)類(lèi)型的函數(shù)定義舔示,必須使用def關(guān)鍵字
def nonReturnTypeFunc(){
last_line //最后一行代碼的執(zhí)行結(jié)果就是本函數(shù)的返回值
}
//如果指定了函數(shù)返回類(lèi)型碟婆,則可不必加def關(guān)鍵字來(lái)定義函數(shù)
String getString(){
"I am a string"
}
** groovy中最后一行代碼就是函數(shù)的返回值 **
簡(jiǎn)寫(xiě)
groovy中定義的函數(shù),如果至少有一個(gè)參數(shù)惕稻,在調(diào)用的時(shí)候可以省略括號(hào)竖共。比如這樣
def func(String a){
println(a)
}
func 'hello'
在gradle有大量省略括號(hào)調(diào)用函數(shù)的例子,比如
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
默認(rèn)修飾符為public
class Test{
String name;
}
public成員變量默認(rèn)有g(shù)et俺祠,set函數(shù),例如上面的Test類(lèi)
println("my name is " + new Test().getName())
自動(dòng)導(dǎo)入常用java庫(kù), 使用file等文件無(wú)需導(dǎo)入公给,但是一些第三方的還是需要import
groovy.lang.*
groovy.util.*
java.lang.*
java.util.*
java.net.*
java.io.*
java.math.BigInteger
java.math.BigDecimal
變量引用
def nick = 'Gina'
def book = 'Groovy in Action'
assert "$nick is $book" == 'Gina is Groovy in Action'
list/map/range
def listA = ['1','2','3']
println(listA[1]) //'2'
def http = [ 100 : 'CONTINUE', 200 : 'OK']
println(http[200]) //'ok'
def x = 1..10
assert x.contains(5)
assert x.size() == 10
assert x.from == 1
assert x.to == 10
for(i in x) ...
閉包 (重點(diǎn),后面的gradle經(jīng)常使用)
很多C程序員蜘渣,都習(xí)慣傳遞方法指針作為方法的參數(shù)妓布,但是在java里,卻無(wú)法做到這一點(diǎn)宋梧,現(xiàn)在groovy福利來(lái)了,這就是閉包()
參考文章: