天天看点

groovy–流程控制

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 &gt; </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-- &gt; </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 &lt; </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 -&gt; </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 -&gt; </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 -&gt; </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,如需转载请自行联系原作者