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)
}