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