String
//'' 不能動態打印
print'x=${x}' //"x=${x}"
//""可以動態打印,{}中可以放表達式,只有一個變量時可以省略花括號
print'x=${x}' //"x=1"
print'x=$x' //"x=1"
//''' '''支持任意換行
集合
Groovy完全兼容了Java的集合,並且進行了擴展
List
def list=[1,2,3,4,5]
println list[-1] //倒數第一個元素
println list[1..3] //訪問第二到第四元素
list.each{
print it
}
Map
def map=['key1':1,'key2':2]
print map['key1']
map.each{
//it:Map.Entry
}
方法的編寫以及調用
task testMethod {
//()可以省略
def x =method 1,2
println x
}
def int method(int a,int b){
//有返回值是可以省略return 會默認把最後依據作爲返回值
a+b
}
閉包
代碼塊是可以作爲參數傳遞
task testC << {
method (10){
a,b->
println a
println b
}
}
def method(int a,closure){
a=a*a
closure(a,a)
}
閉包作爲參數
list.each({
it.xxx
})
//最後一個參數是閉包,可以放到外面
list.each(){
it.xxx
}
//括號可以省略
list.each{
it.xx
}
JavaBean
Javabean.屬性來直接獲取和設置
閉包的委託
Groovy的強大之處是在於它支持方法的委託.
閉包具有三個屬性:
thisObject
owner
delegate
在閉包內調用方法時,可以指定通過哪個對象來處理.
默認情況下delegate與owner是相等的
但delegate是可以被修改的
//thisObject的優先級最高,thisObject其實就是構建這個腳本的上下文,它和腳本的中this是相等的
thisObject>owner>delegate
Demo
task testC << {
testPerson{
name="小黃"
age=18
dumpPerson()
}
}
class Person{
String name;
int age;
void dumpPerson(){
println "$name : $age"
}
}
def testPerson(Closure<Person> closure){
def p=new Person();
closure.delegate=p;
//委託模式優先
closure.setResolveStrategy(Closure.DELEGATE_FIRST);
closure(p)
}