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–流程控制相关推荐
- [JavaScript] JavaScript 运算符与流程控制
本文主要介绍switch,do-while,for-in,for-of的使用方法. 有关if-else,for,while等简单流程控制,和别的语言相似且常见,我没有自己写,本文将展示教程配套课件中的 ...
- Python学习笔记3 流程控制、迭代器、生成器
第3章 流程控制.迭代器.生成器 3.1 选择语句 1.语法:(1)if -else (2)if-elif-else 2.注意:(1)每个条件后面要使用冒号:(2)使用缩进划分语句块(3)python ...
- python如何控制程序的运行顺序_Python流程控制-1 顺序执行
流程控制指的是代码运行逻辑.分支走向.循环控制,是真正体现我们程序执行顺序的操作.流程控制一般分为顺序执行.条件判断和循环控制. 顺序执行 Python代码在执行过程中,遵循下面的基本原则: 普通语句 ...
- Python黑帽编程2.4 流程控制
Python黑帽编程2.4 流程控制 本节要介绍的是Python编程中和流程控制有关的关键字和相关内容. 2.4.1 if -..else 先上一段代码: #!/usr/bin/python # - ...
- Java程序流程控制(顺序结构、分支结构、循环结构、if-else、switch-case、for、while、do-while、break、continue、return)
流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块. 其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即: 顺序结构 ...
- mysql 控制函数库_数据库开发——MySQL——函数与流程控制
一.函数 1.介绍 1.1.数学函数 ROUND(x,y) 返回参数x的四舍五入的有y位小数的值 RAND() 返回0到1内的随机值,可以通过提供一个参数(种子)使RAND()随机数生成器生成一个指定 ...
- python怎么控制while循环_Python流程控制之while循环怎么学呢?老男孩Python
学习Python流程控制if条件语句之后,利用if ... else来猜年龄,但是只能猜一次就中的机率太小了,如果想给玩家3或者几次机会怎么办呢?总不能把代码复制3次吧,以后要修改功能还得修改3次.那 ...
- JavaScript异步流程控制的前世今生
js的流程控制老大难问题就是异步回调. 一个流程过程,往往会出现回调地狱,这个回调异步控制就被提上研究得议程. 目前有实现的回调流程有以下几种 回调函数实现 事件监听 发布订阅 Promise/A+ ...
- 05JavaScript中的流程控制
技术交流QQ群:1027579432,欢迎你的加入! 1.流程控制 在一个程序执行的过程中,各条代码的执行顺序对程序的结果是有直接影响的.很多时候我们要通过控制代码的执行顺序来实现我们要完成的功能. ...
最新文章
- 把ePO4.5或者4.6从32位迁移到64位系统
- NIO详解(三):IO多路复用模型之select、poll、epoll
- 我的世界javamod怎么装_「装修细节」除了中央空调外的高颜值装空调大法
- 话费直充/三网直冲/联通直充/电信直充/移动直充/系统源码
- 打开Android Studio报错required plugin “Android Support” is disabled
- 楼市新政催生“金十月” 二手房改善需求变成交主力
- 文本的编码格式: ANSI、ASCII、UTF8、UNICODE、GB2312、UCS-2、UTF16
- 算法竞赛入门经典(第二版)习题代码语言篇(一)
- 哈希---平方探测法
- 系统集成项目管理工程师 下午 真题 及考点(2022年四套卷)
- PowerApps教程07-记录的详细信息显示
- Vue 实现翻页器 下一页 处理显示多页面要下一页非表格
- HBuilder:安装使用Less
- html长图转换成pdf,支持把各类文档转换成 HTML5(SVG)接口、长图片、PDF 。word转pdf、word转html5、pdf转网页html5、pdf转图片的接口...
- 数据结构课设—图型结构题目—行车路线
- idea如何关闭代码提示,设置快捷键提示代码
- switch中的参数类型
- 基于STM32的智能车/平衡小车/蓝牙小车
- 企业即时通讯软件提高工作效率的三个要点
- ngnix配置及实例
热门文章
- mysql 快捷查询数据库各表占用空间,mysql查看索引占用空间,mysql查看数据占用空间
- 数据结构(02)— 时间复杂度与空间复杂度转换
- SpringCloud Alibaba微服务实战(五) - Sentinel实现限流熔断
- openpyxl.utils.exceptions.IllegalCharacterError错误
- ?:在正则表达式中什么意思
- RNN,LSTM,GRU基本原理的个人理解重点
- TensorFlow XLA加速编译器
- CUDA Pro:通过向量化内存访问提高性能
- 用于ONNX的TensorRT后端
- 色彩(颜色)空间原理(中)