groovy語法系列之groovy與gradle初探

開發(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)的使用會有更多的不同之處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容