開發(fā)android都知道,groovy是編寫gradle腳本的的核心語言,那要了解gradle之前,首先要了解groovy的語法結(jié)構(gòu),下面來說下groovy的基礎(chǔ)語法:
groovy中變量說明:
由于是若語言,所以用def關(guān)鍵詞定義,而且groovy語句結(jié)束后也不用分號結(jié)尾,并且有自動裝箱的功能
def a1=3
println(a1.class)
//結(jié)果為java.lang.Integer
def a1=3.1
println(a1.class)
//結(jié)果為 java.math.BigDecimal
def a1='3.1'
println(a1.class)
//結(jié)果為class java.lang.String
可以看到groovy默認(rèn)設(shè)置了自動裝箱的功能,其實在定義變量時,groovy語言希望開發(fā)者用def關(guān)鍵字的,而在方法作為形參時,則不建議如此。
groovy中字符串:
單引號
def a1='studen \'s\'s'
println(a1)
//結(jié)果為studen 's's
用反斜杠代表轉(zhuǎn)義字符
雙引號
def sex='male'
def a1="my sex is ${sex}"
println(a1)
//結(jié)果為my sex is male
println(a1.class)
//結(jié)果為class org.codehaus.groovy.runtime.GStringImpl
可以看到可以在""中插入表達式,當(dāng)然由于特殊性,它的類型不是String而是GString,當(dāng)然這兩個可以相互調(diào)用和傳遞
三引號
def a1='''aaa
bbb
ccc
'''
println(a1)
//結(jié)果為aaa
// bbb
// ccc
可以看到輸出可以按照你輸入的格式來輸出
groovy中閉包:
閉包是groovy中特有的,有點類似于回掉,當(dāng)然剛開始可能很難理解它,不過用多了就會對他愛不釋手了,閉包的格式如下:
def a = {
println("hello word")
}
a.call()
// 結(jié)果如下hello word
可以看到可以把閉包a看成一個對象,然后里面有個call方法,調(diào)用了call方法就調(diào)用了類的call方法,也就是輸出了hello word。
當(dāng)然也可以直接調(diào)用
def a = {
println("hello word")
}
a()
// 結(jié)果如下hello word
也是可以的
另外,閉包這個特殊的“方法”是一定有返回值的,即使你不寫return語句
def a = {
println("aaaa")
}
println(a.call())
// 結(jié)果如下
//aaaa
// null
可以看到無論是方法還是閉包在groovy中都是以最后一行表達式作為返回值的,如上代碼最后一行是一個輸出語句,返回值自然為null,如果把println去掉,返回值就是aaaa了
groovy中閉包參數(shù):
當(dāng)然,你也可以對于閉包定義相應(yīng)的參數(shù)
def a = {
def sex ->
println("hello word ${sex}")
}
a.call("male")或者a("male")
// 結(jié)果為 hello word male
而groovy為了簡化寫法,可以把一個參數(shù)的用it表示
def a = {
println("hello word ${it}")
}
a.call(male)
// 結(jié)果為 hello word male
這樣也是可以的,甚至
def a = {
println("hello word ${it}")
}
a.call()
// 結(jié)果為 hello word null
也不會報錯,只是返回一個null而已
當(dāng)然,如果是多個參數(shù)的話,編譯器就會報錯了
def a = {
def student,def sex->
println("hello word ${sex}")
}
a.call('male')
這樣是不行的
當(dāng)然,如果在方法參數(shù)里有閉包,而且是最后一個參數(shù)的話,方法中的閉包是可以寫到外面的去的
println(getNumber(10))
def getNumber(int number) {
int totlaNumber = 0
number.downto(1) {
totlaNumber += it
}
return totlaNumber
// 結(jié)果為 55
}
這段代碼其實就是在groovy中int類型的值,有個方法叫downto,調(diào)用如下
public static void downto(Number self, Number to, @ClosureParams(FirstParam.class) Closure closure) {
int self1 = self.intValue();
int to1 = to.intValue();
if (self1 < to1) {
throw new GroovyRuntimeException("The argument (" + to + ") to downto() cannot be greater than the value (" + self + ") it's called on.");
} else {
for(int i = self1; i >= to1; --i) {
closure.call(i);
}
}
}
可以看到,調(diào)用的閉包的參數(shù)是一個參數(shù)的,所以你定義閉包的時候只要寫一個參數(shù)的即可,是一個類加的函數(shù)
輸出結(jié)果就是1到10累加的值
groovy中閉包基本的方法
在groovy中,很多方法都與閉包做關(guān)聯(lián)的,可以說是無處不在
例如String類中的each方法
def name="zhangshan"
name.each {
println(it+" ")
}
//結(jié)果為 z h a n g s h a n
輸出的是zhangshan的每個字符
當(dāng)然還有find方法
def name="zhAngs1han"
def result=name.find {
return it.isInteger()
}
println(result)
//結(jié)果為 1
其實就是遍歷String中的值找符合條件的第一個值
找到了返回相應(yīng)的值,找不到就返回null
當(dāng)然類似的還有findall方法
def name="zhAngs1han"
def result=name.findAll {
return it.isInteger()
}
println(result.toListString())
//結(jié)果為 [1]
當(dāng)然還有collect方法
def name = "zhAng1sahan"
def result = name.collect {
if (it.isNumber()) {
it += 1
}
return it
}
println(result)
//結(jié)果為[z, h, A, n, g, 11, s, a, h, a, n]
這里collect方法是表示把返回的值加到集合中,這里與each不同的是
each方法返回的是調(diào)用者的本身,而collect返回的是用for循環(huán)遍歷過的list集合
總結(jié):
groovy與java還是有很多相似地方的,主要不同在于閉包的使用,下一篇文章探討groovy中數(shù)據(jù)結(jié)構(gòu)的使用會有更多的不同之處