这里对Groovy的基本语法进行介绍
数字类型
不同于Java使用基本类型、引用类型进行区分。对于Groovy而言,其一切均是对象。虽然Groovy语法中保留并使用int、short、boolean这些关键字。但并不代表相应的数据类型是基本类型,其使用的依然是Java中相应基本类型的包装类型。示例代码如下所示
1 | class NumberDemo { |
类似地,可以通过在数字后面添加相应的后缀来表示数字的类型。具体地如下所示
1 | class NumberDemo { |
前面提到既然数字是对象类型而不是基本类型的,那自然可以直接调用方法。这里就Groovy增强的方法进行实践,如下所示
1 | class NumberDemo { |
字符串
Groovy中支持多种形式的字符串定义方式
单引号
直接利用单引号定义字符串,则其实际上是Java String类的实例
1 | class StringDemo { |
测试结果,如下所示
双引号
在Groovy中使用双引号定义字符串,则是有特殊含义的。即支持使用占位符${}进行插值,其中占位符的花括号{}在不引起歧义的前提下可以省略。具体地,字符串中如果不含占位符, 则其是Java String的实例;反正,则是Groovy GString的实例。示例代码如下所示,可以看到str2b中的x已经被替换为1了
1 | class StringDemo { |
三重单引号
Groovy还支持通过三重单引号定义存在多行的字符串。由于其只是一个普通的Java String实例,故不支持通过占位符进行插值。由于在定义多行字符串过程中,字符串的任何缩进均会被视为有效的空格字符。故str3a变量中的字符串都需要顶格写。如果执意进行缩进,那么最后应该通过stripIndent方法移除指定数量的缩进
1 | class StringDemo { |
测试结果,如下所示
三重双引号
如果期望对多行字符串支持占位符进行插值,则可进一步通过三重双引号进行定义。类似地,字符串中如果不含占位符, 则其是Java String的实例;反正,则是Groovy GString的实例。示例代码如下所示
1 | class StringDemo { |
测试结果,如下所示
斜杠
字符串中如果存在一些特殊字符时,需要使用大量的反斜杠进行转义。为此Groovy提供一种通过斜杠定义字符串的方法。类似地,字符串中如果不含占位符, 则其是Java String的实例;反正,则是Groovy GString的实例。示例代码如下所示。显然此种方式十分适合用来定义、表示正则表达式
1 | class StringDemo { |
字符类型
这里对字符类型的字面量作一些补充说明,Groovy中没有专门用来表示单个字符的方式。故可以将只包含单个字符的字符串转换为字符。具体地转换方式如下述代码所示
1 | class StringDemo { |
表达式真值规则
对于Java而言,其要求表达式的结果必须是布尔类型才可以判断真/假。而在Groovy中表达式真值判定的限制被进一步放宽,其可以对任何一个表达式进行真值判定。下面就Groovy中的表达式的真值规则进行介绍
布尔值可以直接 作为 真值结果
1 | // 布尔值true 表示 真 |
布尔表达式计算的布尔值结果 作为 真值结果
1 | // 布尔表达式直接计算布尔值结果 作为 真/假 |
对于数组、集合而言,非空为真、空为假
1 | def list1 = ["a", 23] |
对于字符串而言,非空为真、空为假
1 | // 非空字符 表示 真 |
对于数字而言,非零为真、零为假
1 | // 非零 表示 真 |
对于引用而言,非NULL为真、NULL为假
需要注意的是对于指向空集合的引用而言,即使非NULL,但根据集合的真值判定规则,空集合为假
1 | def obj = new Object() |
对于正则匹配而言,匹配成功为真、匹配失败为假
1 | // 正则匹配成功 表示 真 |
异常
对于异常机制而言,Groovy与Java一样不仅支持传统的try/catch/finally语句,同样还支持资源自动管理ARM机制,即TWR语法。不同之处在于,Groovy方法无论是抛出CheckedException受查异常,还是抛出RuntimeException运行时异常。方法签名处的异常抛出声明均是可选的。示例如下所示,可以看出总体上与Java保持了一致
1 | /** |
控制结构
if语句
Groovy在if语句上与Java并无二致,只不过在条件表达式上更加丰富。可以使用任何的表达式,并应用上文所述的真值规则判定表达式的结果。示例代码如下所示
1 | class StatementDemo { |
while语句
whiile语句方面,同样支持while、do-while两种形式
1 | class StatementDemo { |
for语句
Groovy不仅支持传统for循环、Java经典的for each循环,还针对集合容器提供了for in循环
1 | class StatementDemo { |
switch语句
Groovy支持传统的switch语句.需要注意的是,当匹配到某个case时如若未遇到break,则其会一直执行下去
1 | class StatementDemo { |
特别地,Groovy中的Switch语句还支持使用分类器,用来判断某个值是否属于某个分类。示例如下所示。事实上进行分类判断时,本质上是通过调用分类器的isCase方法实现的
1 | class StatementDemo { |
参考文献
- Groovy In Action · 2nd Edition Dierk König、Guillaume Laforge著