Gradle系列(一) Groovy 基礎(chǔ)

1. 前言

Gradle系列已完成,專注于Gradle,有如下幾篇文章

2. 什么是Groovy

在學(xué)習(xí)Gradle之前,需要簡單普及一下Groovy的語言基礎(chǔ).Groovy是一門jvm語言,特定領(lǐng)域的語言,里面的水特別深.我們不需要全部記住和掌握,只需要記得一些常用的,不清楚的立刻去查API 文檔.

Groovy官方文檔

因為目前Android的主流構(gòu)建工具是用的Gradle,而Gradle使用時就需要用到Groovy,還有Gradle DSL和Android DSL.Gradle里面其實東西比較多.隨便說幾個,比如渠道包(差異包),AOP,插樁,熱修復(fù),插件化等等,都需要用到Gradle.所以我們Android開發(fā)人員對于Gradle的需求非常大.有必要搞清楚.

3. 簡單使用Groovy

打開Android Studio,隨便新建一個Android項目.點擊頂部Tools->Groovy Console即可,這時AS會出來一個窗口,專門拿來運行那種臨時的Groovy代碼的.因為是在本地執(zhí)行,所以執(zhí)行速度會非常快.寫好代碼后點擊窗口左上角的三角按鈕即可運行代碼.

4. 語法

droovy的語法比java簡潔很多

4.1 簡單示范

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中不用寫分號
  • 變量類型可以省略
  • 方法返回類型可以省略,上面test方法中的return也可以省略
  • 變量類型比較弱,可以推斷出來
  • 字符串可以用雙引號或者單引號包起來

4.2 String

def name = "zhangsan"
def b = 2

def test(a, b) {
    println("a=${a} b=${b}")
}

test(name, b)

//輸出
a=zhangsan b=2
  • String中如果需要使用到變量,則需要使用$和{}關(guān)鍵字,并且需要使用雙引號的時候才能這樣用
  • 可以看到方法的入?yún)⒛抢镆部梢允÷灶愋?/li>
  • Java中String有的方法,它都有

4.3 閉包

閉包感覺有點像kotlin的高階函數(shù)(不知道對不對),可以將一個閉包作為參數(shù)傳入方法,也可以賦值給變量.然后調(diào)用call方法即可調(diào)用閉包.kotlin是調(diào)用invoke.

//定義閉包      閉包的參數(shù)
def closure = { int a, String b ->
    println("a=${a} b=${b}")
    //閉包返回值
    return a + b
}
//調(diào)用閉包   定義result變量不用寫def也可以,666
result = closure.call(1, "name")
println(result)

//輸出
a=1 b=name
1name
  • 閉包使用call方法調(diào)起,需要傳入?yún)?shù)
  • 閉包定義時的參數(shù)類型是可以省略的

4.4 List

比Java中的更加強大.當(dāng)遇到不會的方法的時候去查API文檔,比如下面的示例代碼中的each閉包,你肯定不知道閉包的參數(shù)是什么,這時我們打開,List的文檔地址,找到each方法,知道了原來是遍歷每個元素,參數(shù)是每個元素.

//list 可以存放不同的數(shù)據(jù)類型
def list = [1, "test", true, 2.3]
list.each { item ->
    println(item)
}

list.each {
  println(it)
}

//輸出
1
test
true
2.3
  • 閉包的參數(shù)只有一個時是可以省略的,在里面使用時用it代替.和kotlin很像.
  • list支持list[1]這種形式的訪問

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']訪問和賦值
  • 也支持map.id訪問和賦值
  • each遍歷支持2種閉包,使用方式如上,記不清楚沒關(guān)系,使用的時候去查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
  • 非常好用,簡單直接地讀取文件內(nèi)容
  • 其他好用的API,請參閱這里

4.7 類

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操作符,可以對book對象內(nèi)部屬性進(jìn)行操作,調(diào)用方法等
  • 使用?可以避免空指針,免得判空.就像kotlin一樣,很棒.

5. 總結(jié)

我個人認(rèn)為,基礎(chǔ)掌握差不多這么多就行了,剩下的遇到了再查官方文檔.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容