1 |
if ( ... ) { |
2 |
... |
3 |
} else if (...) { |
4 |
... |
5 |
} else { |
6 |
... |
7 |
} |
三元操做符
Groovy 也支持Java傳統的三元操做符:ruby
1 |
def y = 5 |
2 |
def x = (y > 1 ) ? "worked" : "failed" |
3 |
assert x == "worked" |
switch
Groovy也支持switch語句,不過和java的switch語句仍是有很大的區別的:閉包
1 |
def x = 1.23 |
2 |
def result = "" |
3 |
4 |
switch ( x ) { |
5 |
case "foo" : |
6 |
result = "found foo" |
7 |
// lets fall through |
8 |
9 |
case "bar" : |
10 |
result += "bar" |
11 |
12 |
case [ 4 , 5 , 6 , 'inList' ]: |
13 |
result = "list" |
14 |
break |
15 |
16 |
case 12 .. 30 : |
17 |
result = "range" |
18 |
break |
19 |
20 |
case Integer: |
21 |
result = "integer" |
22 |
break |
23 |
24 |
case Number: |
25 |
result = "number" |
26 |
break |
27 |
28 |
default : |
29 |
result = "default" |
30 |
} |
31 |
32 |
assert result == "number" |
從上面的例子能夠看出switch ( x )中的x能夠使用任何類型的值,並且下面的匹配值也能夠使用任何的類型。spa
循環
Groovy也支持Java傳統的while循環語法:code
1 |
def x = 0 |
2 |
def y = 5 |
3 |
4 |
while ( y-- > 0 ) { |
5 |
x++ |
6 |
} |
7 |
8 |
assert x == 5 |
for循環
在Groovy中,for循環更加的簡單,並且若是你願意的話,你也能夠在Groovy中使用標準的C/Java的for循環語法。blog
1 |
for ( int i = 0 ; i < 5 ; i++) { |
2 |
} |
3 |
4 |
// iterate over a range |
5 |
def x = 0 |
6 |
for ( i in 0 .. 9 ) { |
7 |
x += i |
8 |
} |
9 |
assert x == 45 |
10 |
11 |
// iterate over a list |
12 |
x = 0 |
13 |
for ( i in [ 0 , 1 , 2 , 3 , 4 ] ) { |
14 |
x += i |
15 |
} |
16 |
assert x == 10 |
17 |
18 |
// iterate over an array |
19 |
array = ( 0 .. 4 ).toArray() |
20 |
x = 0 |
21 |
for ( i in array ) { |
22 |
x += i |
23 |
} |
24 |
assert x == 10 |
25 |
26 |
// iterate over a map |
27 |
def map = [ 'abc' : 1 , 'def' : 2 , 'xyz' : 3 ] |
28 |
x = 0 |
29 |
for ( e in map ) { |
30 |
x += e.value |
31 |
} |
32 |
assert x == 6 |
33 |
34 |
// iterate over values in a map |
35 |
x = 0 |
36 |
for ( v in map.values() ) { |
37 |
x += v |
38 |
} |
39 |
assert x == 6 |
40 |
41 |
// iterate over the characters in a string |
42 |
def text = "abc" |
43 |
def list = [] |
44 |
for (c in text) { |
45 |
list.add(c) |
46 |
} |
47 |
assert list == [ "a" , "b" , "c" ] |
閉包(closures)
有時候你也能夠使用閉包的each()和eachWithIndex()方法來替換一些for循環代碼。string
1 |
def stringList = [ "java" , "perl" , "python" , "ruby" , "c#" , "cobol" , |
2 |
"groovy" , "jython" , "smalltalk" , "prolog" , "m" , "yacc" ]; |
3 |
4 |
def stringMap = [ "Su" : "Sunday" , "Mo" : "Monday" , "Tu" : "Tuesday" , |
5 |
"We" : "Wednesday" , "Th" : "Thursday" , "Fr" : "Friday" , |
6 |
"Sa" : "Saturday" ]; |
7 |
8 |
stringList. each () { print " ${it}" }; println "" ; |
9 |
// java perl python ruby c# cobol groovy jython smalltalk prolog m yacc |
10 |
11 |
stringMap. each () { key, value -> println "${key} == ${value}" }; |
12 |
// Su == Sunday |
13 |
// We == Wednesday |
14 |
// Mo == Monday |
15 |
// Sa == Saturday |
16 |
// Th == Thursday |
17 |
// Tu == Tuesday |
18 |
// Fr == Friday |
19 |
20 |
stringList. eachWithIndex () { obj, i -> println " ${i}: ${obj}" }; |
21 |
// 0: java |
22 |
// 1: perl |
23 |
// 2: python |
24 |
// 3: ruby |
25 |
// 4: c# |
26 |
// 5: cobol |
27 |
// 6: groovy |
28 |
// 7: jython |
29 |
// 8: smalltalk |
30 |
// 9: prolog |
31 |
// 10: m |
32 |
// 11: yacc |
33 |
34 |
stringMap. eachWithIndex () { obj, i -> println " ${i}: ${obj}" }; |
35 |
// 0: Su=Sunday |
36 |
// 1: We=Wednesday |
37 |
// 2: Mo=Monday |
38 |
// 3: Sa=Saturday |
39 |
// 4: Th=Thursday |
40 |
// 5: Tu=Tuesday |
41 |
// 6: Fr=Friday |
從if-else和try-catch代碼塊中返回值
從 Groovy 1.6開始,在方法或者閉包中的最後一行表達式,能夠從if/else和try/catch/finally代碼塊中返回值,並且並不須要明確的使用return關鍵字返回值,只須要他們是代碼塊的最後一個表達式就行。it
下面的例子就說明了這個狀況,在下面的代碼塊中雖然沒有顯示的調用return關鍵字,可是仍然會返回1:
1 |
def method() { |
2 |
if (true) 1 else 0 |
3 |
} |
4 |
5 |
assert method() == 1 |
對於 try/catch/finally blocks代碼塊來講,若是try代碼塊中沒有拋出異常的話,那麼try代碼塊的最後一行的表達式將會被返回,若是try的代碼塊拋出異常而且被catch住的時候,那麼catch代碼塊中的最後一個表達式的值將會被返回。
可是請注意:finally代碼塊不會返回值的。
1 |
def method(bool) { |
2 |
try { |
3 |
if (bool) throw new Exception( "foo" ) |
4 |
1 |
5 |
} catch (e) { |
6 |
2 |
7 |
} finally { |
8 |
3 |
9 |
} |
10 |
} |
11 |
12 |
assert method(false) == 1 |
13 |
assert method(true) == 2 |