Gradle理論與實踐二:Groovy介紹
阿新 • • 發佈:2018-12-24
文章目錄
Groovy介紹
Groovy是基於JVM虛擬機器的一種動態語言,語法和Java非常相似,Groovy程式碼在執行時同樣編譯成Class位元組碼在JVM上執行,可以認為Groovy擴充套件了Java語言。除此之外,Groovy還支援閉包、支援DSL(Domain Specific Lauguage 領域特定語言),是一門非常靈活的指令碼語言。
Groovy、Java、JVM之間的關係:
Groovy的一些特點:
- Groovy語句可以不用分號結尾;
- Groovy使用def關鍵字定義變數(def不是必須的,但建議不要省略),定義變數的時候可以不指定其型別;同樣Groovy定義函式時,引數也可以不指定型別;
- Groovy除了變數和函式中的引數可以不指定型別,函式中如果有返回值,可以省略return,函式中最後一句程式碼執行結果即是返回值。
1、字串處理
在Java中,雙引號代表一個字串,單引號代表是字元;在Groovy中,單引號和雙引號都可以定義一個字串常量,但是單引號和雙引號也是有區別的,如下:
vatask hello {
def name = "beijing"
doLast {
print "雙引號:name is ${name}\n"
print '雙引號:name is ${name}'
}
}
結果:
bogon:test_gradle mq$ gradle -q hello
雙引號:name is beijing
雙引號:name is ${name}
從輸出結果可以得出結論:單引號是不具備運算能力的,所有表示式都被認為是字串;而雙引號可以通過${}表示式放入變數或者進行表示式計算。
2、集合的宣告與操作
List
對應Java中的List介面,其實現類是ArrayLIst.
- 定義List:
def myList = [1, 2, 3, 4, 5]
myList的型別是java.util.ArrayList
- List取值:
print numList[0]//訪問第一個元素 結果為1
print numList[1]//訪問第二個元素 結果為2
print numList[-1]//訪問倒數第一個元素 結果為5
print numList[1..3]//訪問第二個到第四個元素 結果為[2,3,4]
可見在Groovy中索引值不僅可以是正的,還可以是負的,表示從右往左數;還可以是一個範圍索引(如1…3);如果索引越界,返回Null。
- 遍歷List
使用List.each即可遍歷LIst,如:
task hello << {
def numList = [1, 2, 3, 4, 5]
numList.each {
print it
}
}
Map
- 定義Map、Map取值、遍歷Map
//定義Map 以K-V形式儲存 其中country、city為Key值,china、beijing為value
def myMap = ['country': 'china', 'city': 'beijing']
//下面兩種方式都可以獲取到key對應的value
print myMap.country //結果為china
print myMap['country'] //結果為china
//map迭代也是用each方法,迭代的元素是一個Map.Entry
myMap.each {
print "Key:${it.key},value:${it.value}"
}
3、方法
- 方法的括號是可以省略的,如下:
static def mMethod(int a, int b) {
return a + b
}
task hello << {
//下面兩種方式結果是一樣的
mMethod(2, 3)
mMethod 2, 3
}
mMethod中的return也是可以省略的,當沒有return時,Groovy會把方法執行過程中的最後一句程式碼作為其返回值。
- 程式碼塊(閉包closure)可以作為引數傳遞
**被{}包圍起來的程式碼被稱為程式碼塊。**Groovy允許一個程式碼塊可以作為引數傳遞到方法裡的,如下面三種方式:
task hello << {
def myList = [1, 2, 3, 4, 5]
//第一種:方法中傳入程式碼塊{}
myList.each({ print it })
//第二種:Groovy規定,如果方法最後一個引數是閉包,可以放到方法外面
myList.each() { print it }
//第三種:方法括號可以省略,就變成我們最常見的形式了
myList.each {
print it
}
}
4、閉包
閉包(Closure)是一種資料型別,通俗來說就是一段可執行的程式碼塊。來自定義一個閉包:
//定義一個閉包
static def customClosure(closure) {
def myMap = ['name': 'mq', 'country': 'china']
myMap.each {
//閉包中有兩個引數
closure(it.key, it.value)
}
}
task hello << {
customClosure {
//宣告多個引數 對應閉包中的key和value
k, v ->
print "${k} is ${v}\n"
}
}
當閉包中有一個引數時,預設就是it;當有多個引數時,就不能用it了,需要宣告多個引數。如用 (k,v) 宣告閉包中的兩個引數, ->操作符用於把閉包的引數和主體區分開。