groovy语句类似于java语句,但是在groovy中的分号”;”是可选的。比如:
3 |
def y = 5 ; def x = y + 7
|
而且对于一些方法参数等复杂的事情,我们可以横跨多行:
11 |
assert false: "should never happen ${x}"
|
groovy支持一行给多个变量赋值:
这就使得我们的方法可以返回多个值了,比如返回经纬度的方法:
1 |
def geocode(String location) {
|
2 |
// implementation returns [48.824068, 2.531733] for Paris, France
|
6 |
def (_lat, _long) = geocode( "Paris, France" )
|
8 |
assert _lat == 48.824068
|
9 |
assert _long == 2.531733
|
当然我们也可以定义方法的参数类型:
1 |
def ( int i, String s) = [ 1 , 'Groovy' ]
|
对于事先已经定义好的变量,我们在赋值的时候不需要def关键字:
1 |
def firstname, lastname
|
3 |
(firstname, lastname) = "Guillaume Laforge" . tokenize ()
|
5 |
assert firstname == "Guillaume"
|
6 |
assert lastname == "Laforge"
|
当然,在赋值的时候可能会出现两侧的数量不一致的情况,比如当左侧数量多于右侧的时候,左侧多出来的为null:
2 |
def (a, b, c) = elements
|
但是当右侧的多于左侧的时候,多出来的不赋值。
1 |
def elements = [ 1 , 2 , 3 , 4 ]
|
2 |
def (a, b, c) = elements
|
根据groovy的语法,我们可以在一行中swap两个变量:
1 |
// given those two variables |
4 |
// swap variables with a list |
注释:
1 |
print "hello" // This is a silly print statement
|
3 |
/* This is a long comment |
4 |
about our favorite println */
|
我们可以发现#其实并不是注释字符。
方法调用
groovy中的方法调用类似于java,比如:
6 |
static void main(args) {
|
8 |
def p = foo.calculatePrice()
|
11 |
println "Found price: " + p
|
可选的括号
在groovy中,Groovy中的方法调用可以省略括号,如果有至少一个参数,并且不存在任何含糊。比如:
2 |
System.out. println "Nice cheese Gromit!"
|
在命名参数的时候,也是可以省略的:
1 |
compare fund: "SuperInvestment" , withBench: "NIKEI"
|
2 |
monster.move from: [ 3 , 4 ], to: [ 4 , 5 ]
|
命名参数传递
当调用一个方法时,你可以通过在命名参数。参数名称和值之间由一个冒号,比如:
1 |
def bean = new Expando(name: "James" , location: "London" , id: 123 )
|
2 |
println "Hey " + bean.name
|
给方法传递闭包
闭包也可以像其他对象一样传递给方法:
1 |
def closure = { param -> param + 1 }
|
2 |
def answer = [ 1 , 2 ]. collect (closure)
|
3 |
assert answer == [ 2 , 3 ]
|
上面的代码等价于:
1 |
answer = [ 1 , 2 ]. collect { param -> param + 1 }
|
2 |
assert answer == [ 2 , 3 ]
|
属性
为了访问属性你可以使用属性名和.:
1 |
def bean = new Expando(name: "James" , location: "London" , id: 123 )
|
4 |
bean.location = "Vegas"
|
5 |
println bean.name + " is now in " + bean.location
|
6 |
assert bean.location == "Vegas"
|
安全导航
如果你在访问属性的时候,避免出现空指针异常的话,那么安全导航操作符可能适合你:
2 |
def bar = foo?.something?.myMethod()
|