groovy–流程控制
在本篇文章中,我們將介紹邏輯分支,循環,以及如何從if-else以及try-catch代碼塊中返回值。
if – else
Groovy 支持Java傳統的if-else語法:
def x = false def y = falseif ( !x ) {x = true
}assert x == trueif ( x ) {x = false
} else {y = true
}assert x == y
Groovy 也支持Java傳統的if-else if -else 語法:
1 | if?( ... ) { |
2 | ... |
3 | }?else?if?(...) { |
4 | ... |
5 | }?else?{ |
6 | ... |
7 | } |
三元操作符
Groovy 也支持Java傳統的三元操作符:
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可以使用任何類型的值,而且下面的匹配值也可以使用任何的類型。
循環
Groovy也支持Java傳統的while循環語法:
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循環語法。
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循環代碼。
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關鍵字返回值,只需要他們是代碼塊的最后一個表達式就行。
下面的例子就說明了這個情況,在下面的代碼塊中雖然沒有顯示的調用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 |
轉載于:https://www.cnblogs.com/rollenholt/p/3349046.html
總結
以上是生活随笔為你收集整理的groovy–流程控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XMPP通讯开发-好友获取界面设计
- 下一篇: 读书笔记2013第13本:《怎样解题》