在本篇文章中,我们将介绍逻辑分支,循环,以及如何从if-else以及try-catch代码块中返回值。

if – else
Groovy 支持Java传统的if-else语法:

def x = false def y = false

if ( !x ) {
x = true
} assert x == true if ( 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 [456'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 [01234] ) {
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
 

groovy–流程控制的更多相关文章

  1. 第10章 Shell编程(4)_流程控制

    5. 流程控制 5.1 if语句 (1)格式: 格式1 格式2 多分支if if [ 条件判断式 ];then #程序 else #程序 fi if [ 条件判断式 ] then #程序 else # ...

  2. Shell命令和流程控制

    Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字 ...

  3. PHP基础知识之流程控制的替代语法

    PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch. 替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,e ...

  4. Python黑帽编程2.4 流程控制

    Python黑帽编程2.4  流程控制 本节要介绍的是Python编程中和流程控制有关的关键字和相关内容. 2.4.1 if …..else 先上一段代码: #!/usr/bin/python # - ...

  5. 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...

  6. [Java入门笔记] Java语言基础(四):流程控制

    流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下几种: 顺序结构 顺序结构,顾名思义,是指程序从上往下逐步顺序执行.中间没有任何的判断和跳转. 分支结构 Java提供两种分支结构: ...

  7. node基础13:异步流程控制

    1.流程控制 因为在node中大部分的api都是异步的,比如说读取文件,如果采用回调函数的形式,很容易造成地狱回调,代码非常不容易进行维护. 因此,为了解决这个问题,有大神写了async这个中间件.极 ...

  8. Shell入门教程:流程控制(1)命令的结束状态

    在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环 ...

  9. Oracle中PL/SQL的执行部分和各种流程控制

    Oracle中PL/SQL的执行部分和异常部分 一.PL/SQL的执行部分. 赋值语句. 赋值语句分两种,一种是定义一个变量,然后接收用户的IO赋值:另一种是通过SQL查询结果赋值. 用户赋值举例: ...

随机推荐

  1. grunt的使用方法,环境配置和插件安装

    虽然现在grunt的用的越来越少了,但是插件数量还是相当多的,另外grunt和gulp的使用相当相似: grunt需要安装node和npm 验证node是否安装:node -v 验证npm是否安装:n ...

  2. 查询各个商品分类中各有多少商品的SQL语句

    SELECT goods_category_id ,count(*) FROM `sw_goods` group by goods_category_id

  3. 17Mybatis_动态sql-sql片段

    这篇文章讲一下sql片段. 讲一下sql片段的的需求: 将上边实现的动态sql判断代码块抽取出来,组成一个sql片段.其它的statement中就可以引用sql片段. 方便程序员进行开发. 第一步我们 ...

  4. 使用地址栏访问CXF Webservice写法

    /* * 通过url调用 * http://localhost:8080/EFP/webService/TestWebservice/testOut/arg0/liuyx */ http://loca ...

  5. HighCharts 详细使用及API文档说明

    一.HighCharts开发说明: HighCharts开发实际上配置HighCharts每个部分,比如配置标题(title),副标题(subtitle)等,其中每个部分又有更细的参数配置,比如标题下 ...

  6. Linux常用指令---系统管理

    四.linux服务器" [have no space]"开发机dev2上不管是upa/upc上传文件时,会挂载在/目录下,而此时这里只有3G空间,通过df -h显示各大挂载点使用情 ...

  7. Activiti系列:是否可以让某些流程的信息写到历史表,而另外一些不写?

    一.起因     打算使用activiti的定时启动事件来定时启动流程,然后再在该流程中针对每个用户启动另外一个流程实例来计算每个用户的实时账单,系统的用户数一般是1000~2000(此处假设是200 ...

  8. [CareerCup] 10.6 Find Duplicate URLs 找重复的URL链接

    10.6 You have 10 billion URLs. How do you detect the duplicate documents? In this case, assume that ...

  9. linux内核分析 第4章读书笔记

    第四章 进程调度 一.抢占与非抢占 1.非抢占式进程调度 进程会一直执行直到自己主动停止运行 2.抢占式进程调度 Linux/Unix使用的是抢占式的方式,强制的挂起进程的动作就叫做抢占. 二.进程优 ...

  10. 信息安全系统设计基础实验一:Linux开发环境的配置和使用(20135234,20135229)

    http://www.cnblogs.com/mqy123/p/4968386.html