Groovy官网: http://www.groovy-lang.org
Groovy下载: http://www.groovy-lang.org/download.html
Groovy Windows安装
- 解压
- 配置环境变量 GROOVY_HOME
-
检查安装正确 groovy -v
安全导航操作符
?.
def foo(str){
if(str != null){
str.reverse()
}
}
def foo2(str){
str?.reverse()
}
这两个方法实现的是相同的功能,安全导航操作符的目的就是简化java中非空的判断
异常处理
Groovy不强迫我们捕获自己不关心的异常,这些异常会被传递给代码的调用者。
JavaBean
1.0 Groovy中方法和类默认是公开(public)的。
2.0 Groovy会默认给属性创建getter和setter。如果属性用final修改就只有getter。另外 groovy的实现不区分public/private/protected,因此用private修改属性,该属性还是可以方法和修改。
3.0 可以直接用 实例.属性名称,实际调用的是该属性的getter方法
4.0 groovy中的分号可以省略
class Person{
def name
}
Person p = new Person();
p.name = "zhangsan"
println p.name
灵活初始化与具名参数
具名参数即 key : value 形式
class Robot{
def type, height, width
// 如果方法要接受具名参数,需要把第一个形参定义为Map,
//这里没有现式的指定为Map,因为Groovy可以根据传入的参数推断类型
def acess(location, weight, fragile){
println "Received Fragile ? $fragile, weight:$weight, loc:$location"
}
}
//groovy编译器提供了灵活创建构造方法(灵活初始化)
robot = new Robot(type:"arm", width:10, height:40)
println "$robot.type, $robot.height, $robot.width" //arm, 40, 10
robot.acess(x:30,y:20,z:10, 50, true) //Received Fragile ? true, weight:50, loc:[x:30, y:20, z:10]
robot.acess(50,true, x:30,y:20,z:10) //Received Fragile ? true, weight:50, loc:[x:30, y:20, z:10]
robot.acess(true, 50, x:30,y:20,z:10) //Received Fragile ? 50, weight:true, loc:[x:30, y:20, z:10]
robot.acess(true, z:10, 50, x:30,y:20) //Received Fragile ? 50, weight:true, loc:[z:10, x:30, y:20]
/** acess方法的形参只有3个,如果发送的实参个数多余方法的形参个数,而且多出的实参是键值,
那么groovy会假设方法的第一个形参是一个Map,然后将实参列表中的所有键值对组织在一起,
作为第一个形参的值。之后再将剩下的实参按照给出的顺序赋给其余形参。
*/
可选形参
Groovy中可以把方法和构造器的形参设置为可选的。实际上,我们想设置多少就设置多少,但这些形参必须位于形参列表的末尾。
要定义可选形参,只需要在形参列表中给它附上一个值。下面是个一个列子,log()方法带有一个可选的base形参。如果调用时不提供相应实参,则groovy会假定其值为10
def log(x, base = 10){
Math.log(x)/Math.log(base)
}
println log(1024) // 3.0102999566398116
println log(1024,10) // 3.0102999566398116
println log(1024, 2) //10.0
PS: 可选形参,可以在演进式设计中向已用方法添加新的形参。
Groovy还会把末尾的数组形参视作可选的。
使用多赋值
从方法返回多个结果,并将它们一次性赋给多个变量,我们可以返回一个数组,然后将多个变量以逗号分隔,放在圆括号,置于赋值表达式左侧即可。
def (firstName, lastName) = 'zhe ting'.split(' ') //返回一个数组,赋值给两个变量,也无需创建这两个变量
println "$lastName $firstName" // ting zhe
闭包
匿名代码块 即 闭包
def pickEven(n, block){
for(int i=2; i<=n; i+=2){
block(i)
}
}
pickEven(10, {println it})
pickEven() 方法是一个高阶函数,即以函数为参数,或者返回一个函数作为结果的函数。
当闭包是方法调用时的最后一个实参时,可以将闭包附到方法调用上。
def pickEven(n, block){
for(int i=2; i<=n; i+=2){
block(i)
}
}
pickEven(10) {println it} // 等价于pickEven(10, {println it})