if – else
Groovy 支持Java传统的if-else语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<code>def</code> <code>x = false </code><code>def</code> <code>y = false</code>
<code>if</code> <code>( !x ) {</code>
<code> </code><code>x = true</code>
<code>}</code>
<code>assert</code> <code>x == true</code>
<code>if</code> <code>( x ) {</code>
<code> </code><code>x = false</code>
<code>} </code><code>else</code> <code>{</code>
<code> </code><code>y = true</code>
<code>assert</code> <code>x == y</code>
Groovy 也支持Java传统的if-else if -else 语法:
<code>1</code>
<code>if</code> <code>( ... ) {</code>
<code>2</code>
<code>...</code>
<code>3</code>
<code>} </code><code>else</code> <code>if</code> <code>(...) {</code>
<code>4</code>
<code>5</code>
<code>6</code>
<code>7</code>
三元操作符
Groovy 也支持Java传统的三元操作符:
<code>def</code> <code>y = </code><code>5</code>
<code>def</code> <code>x = (y > </code><code>1</code><code>) ? </code><code>"worked"</code> <code>: </code><code>"failed"</code>
<code>assert</code> <code>x == </code><code>"worked"</code>
switch
Groovy也支持switch语句,不过和java的switch语句还是有很大的区别的:
<code>def</code> <code>x = </code><code>1.23</code>
<code>def</code> <code>result = </code><code>""</code>
<code>switch</code> <code>( x ) {</code>
<code> </code><code>case</code> <code>"foo"</code><code>:</code>
<code> </code><code>result = </code><code>"found foo"</code>
<code> </code><code>// lets fall through</code>
<code>8</code>
<code>9</code>
<code>case</code> <code>"bar"</code><code>:</code>
<code>10</code>
<code> </code><code>result += </code><code>"bar"</code>
<code>11</code>
<code>12</code>
<code>case</code> <code>[</code><code>4</code><code>, </code><code>5</code><code>, </code><code>6</code><code>, </code><code>'inList'</code><code>]:</code>
<code>13</code>
<code> </code><code>result = </code><code>"list"</code>
<code>14</code>
<code> </code><code>break</code>
<code>15</code>
<code>16</code>
<code>case</code> <code>12</code><code>..</code><code>30</code><code>:</code>
<code>17</code>
<code> </code><code>result = </code><code>"range"</code>
<code>18</code>
<code>19</code>
<code>20</code>
<code>case</code> <code>Integer:</code>
<code>21</code>
<code> </code><code>result = </code><code>"integer"</code>
<code>22</code>
<code>23</code>
<code>24</code>
<code>case</code> <code>Number:</code>
<code>25</code>
<code> </code><code>result = </code><code>"number"</code>
<code>26</code>
<code>27</code>
<code>28</code>
<code>default</code><code>:</code>
<code>29</code>
<code> </code><code>result = </code><code>"default"</code>
<code>30</code>
<code>31</code>
<code>32</code>
<code>assert</code> <code>result == </code><code>"number"</code>
从上面的例子可以看出switch ( x )中的x可以使用任何类型的值,而且下面的匹配值也可以使用任何的类型。
循环
Groovy也支持Java传统的while循环语法:
<code>def</code> <code>x = </code><code>0</code>
<code>while</code> <code>( y-- > </code><code>0</code> <code>) {</code>
<code> </code><code>x++</code>
<code>assert</code> <code>x == </code><code>5</code>
for循环
在Groovy中,for循环更加的简单,而且如果你愿意的话,你也可以在Groovy中使用标准的C/Java的for循环语法。
<code>for (</code><code>int</code> <code>i = </code><code>0</code><code>; i < </code><code>5</code><code>; i++) {</code>
<code>// iterate over a range</code>
<code>for ( i </code><code>in</code> <code>0</code><code>..</code><code>9</code> <code>) {</code>
<code> </code><code>x += i</code>
<code>assert</code> <code>x == </code><code>45</code>
<code>// iterate over a list</code>
<code>x = </code><code>0</code>
<code>for ( i </code><code>in</code> <code>[</code><code>0</code><code>, </code><code>1</code><code>, </code><code>2</code><code>, </code><code>3</code><code>, </code><code>4</code><code>] ) {</code>
<code>assert</code> <code>x == </code><code>10</code>
<code>// iterate over an array</code>
<code>array = (</code><code>0</code><code>..</code><code>4</code><code>).toArray()</code>
<code>for ( i </code><code>in</code> <code>array ) {</code>
<code>// iterate over a map</code>
<code>def</code> <code>map = [</code><code>'abc'</code><code>:</code><code>1</code><code>, </code><code>'def'</code><code>:</code><code>2</code><code>, </code><code>'xyz'</code><code>:</code><code>3</code><code>]</code>
<code>for ( e </code><code>in</code> <code>map ) {</code>
<code> </code><code>x += e.value</code>
<code>assert</code> <code>x == </code><code>6</code>
<code>33</code>
<code>34</code>
<code>// iterate over values in a map</code>
<code>35</code>
<code>36</code>
<code>for ( v </code><code>in</code> <code>map.values() ) {</code>
<code>37</code>
<code> </code><code>x += v</code>
<code>38</code>
<code>39</code>
<code>40</code>
<code>41</code>
<code>// iterate over the characters in a string</code>
<code>42</code>
<code>def</code> <code>text = </code><code>"abc"</code>
<code>43</code>
<code>def</code> <code>list = []</code>
<code>44</code>
<code>for (c </code><code>in</code> <code>text) {</code>
<code>45</code>
<code> </code><code>list.add(c)</code>
<code>46</code>
<code>47</code>
<code>assert</code> <code>list == [</code><code>"a"</code><code>, </code><code>"b"</code><code>, </code><code>"c"</code><code>]</code>
闭包(closures)
有时候你也可以使用闭包的each()和eachWithIndex()方法来替换一些for循环代码。
<code>def</code> <code>stringList = [ </code><code>"java"</code><code>, </code><code>"perl"</code><code>, </code><code>"python"</code><code>, </code><code>"ruby"</code><code>, </code><code>"c#"</code><code>, </code><code>"cobol"</code><code>,</code>
<code> </code><code>"groovy"</code><code>, </code><code>"jython"</code><code>, </code><code>"smalltalk"</code><code>, </code><code>"prolog"</code><code>, </code><code>"m"</code><code>, </code><code>"yacc"</code> <code>];</code>
<code>def</code> <code>stringMap = [ </code><code>"Su"</code> <code>: </code><code>"Sunday"</code><code>, </code><code>"Mo"</code> <code>: </code><code>"Monday"</code><code>, </code><code>"Tu"</code> <code>: </code><code>"Tuesday"</code><code>,</code>
<code> </code><code>"We"</code> <code>: </code><code>"Wednesday"</code><code>, </code><code>"Th"</code> <code>: </code><code>"Thursday"</code><code>, </code><code>"Fr"</code> <code>: </code><code>"Friday"</code><code>,</code>
<code> </code><code>"Sa"</code> <code>: </code><code>"Saturday"</code> <code>];</code>
<code>stringList.</code><code>each</code><code>() { </code><code>print</code> <code>" ${it}"</code> <code>}; </code><code>println</code> <code>""</code><code>;</code>
<code>// java perl python ruby c# cobol groovy jython smalltalk prolog m yacc</code>
<code>stringMap.</code><code>each</code><code>() { key, value -> </code><code>println</code> <code>"${key} == ${value}"</code> <code>};</code>
<code>// Su == Sunday</code>
<code>// We == Wednesday</code>
<code>// Mo == Monday</code>
<code>// Sa == Saturday</code>
<code>// Th == Thursday</code>
<code>// Tu == Tuesday</code>
<code>// Fr == Friday</code>
<code>stringList.</code><code>eachWithIndex</code><code>() { obj, i -> </code><code>println</code> <code>" ${i}: ${obj}"</code> <code>};</code>
<code>// 0: java</code>
<code>// 1: perl</code>
<code>// 2: python</code>
<code>// 3: ruby</code>
<code>// 4: c#</code>
<code>// 5: cobol</code>
<code>// 6: groovy</code>
<code>// 7: jython</code>
<code>// 8: smalltalk</code>
<code>// 9: prolog</code>
<code>// 10: m</code>
<code>// 11: yacc</code>
<code>stringMap.</code><code>eachWithIndex</code><code>() { obj, i -> </code><code>println</code> <code>" ${i}: ${obj}"</code> <code>};</code>
<code>// 0: Su=Sunday</code>
<code>// 1: We=Wednesday</code>
<code>// 2: Mo=Monday</code>
<code>// 3: Sa=Saturday</code>
<code>// 4: Th=Thursday</code>
<code>// 5: Tu=Tuesday</code>
<code>// 6: Fr=Friday</code>
从if-else和try-catch代码块中返回值
从 Groovy 1.6开始,在方法或者闭包中的最后一行表达式,可以从if/else和try/catch/finally代码块中返回值,而且并不需要明确的使用return关键字返回值,只需要他们是代码块的最后一个表达式就行。
下面的例子就说明了这个情况,在下面的代码块中虽然没有显示的调用return关键字,但是仍然会返回1:
<code>def</code> <code>method() {</code>
<code> </code><code>if</code> <code>(true) </code><code>1</code> <code>else</code> <code>0</code>
<code>assert</code> <code>method() == </code><code>1</code>
对于 try/catch/finally blocks代码块来说,如果try代码块中没有抛出异常的话,那么try代码块的最后一行的表达式将会被返回,如果try的代码块抛出异常并且被catch住的时候,那么catch代码块中的最后一个表达式的值将会被返回。
但是请注意:finally代码块不会返回值的。
<code>def</code> <code>method(bool) {</code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>if</code> <code>(bool) </code><code>throw</code> <code>new</code> <code>Exception(</code><code>"foo"</code><code>)</code>
<code> </code><code>1</code>
<code> </code><code>} </code><code>catch</code><code>(e) {</code>
<code> </code><code>2</code>
<code> </code><code>} </code><code>finally</code> <code>{</code>
<code> </code><code>3</code>
<code> </code><code>}</code>
<code>assert</code> <code>method(false) == </code><code>1</code>
<code>assert</code> <code>method(true) == </code><code>2</code>
==============================================================================
本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/p/3349046.html,如需转载请自行联系原作者