Groovy是一门基于JVM的动态语言,很多语法和Java类似。大部分Java代码也同时是合法的Groovy代码。本文是快速入门,所以针对语法并不会做非常详细的介绍。如果需要详细语法,请直接查看Groovy官方文档。另外为了省事,本文中的大部分代码例子直接引用了Groovy文档。
基本内容
注释
单行注释,以//
开头。
多行注释,/* */
。
GroovyDoc注释,和JavaDoc注释类似。
/**
* Creates a greeting method for a certain person.
*
* @param otherPerson the person to greet
* @return a greeting message
*/
Shebang注释,和Linux其他注释类似,用于指定脚本解释器的位置。
#!/usr/bin/env groovy
标识符
大体上,Groovy标识符的命名规则和Java差不多。如果某个标识符在Groovy中合法,在Java中不合法,我们可以使用单引号或双引号将标识符包括起来。
字符串
字符串可以使用单引号'
或双引号"
包括起来。
def str="1234"
def str2='1234'
多行字符串可以使用三个连续的单引号或双引号包括。不论是单行还是多行字符串, 都可以使用反斜杠转义字符。
def multiline="""line1
line2
line3
"""
我们还可以将变量直接插入到字符串中,这叫做内插字符串(String interpolation)。语法和EL表达式类似。编译器会把美元和花括号中的内容替换成实际的值,内插字符串中还可以进行表达式计算。
def name = 'Guillaume' // a plain string
def greeting = "Hello ${name}"
当内插字符串可以由前后的符号区分出的时候,花括号可以省略。
def person = [name: 'Guillaume', age: 36]
assert "$person.name is $person.age years old" == 'Guillaume is 36 years old'
当使用内插字符串的时候,字符串字面值是Groovy的字符串类型GString。这一点需要注意。普通的Java字符串是不变的,而GString是可变的。另外它们的哈希值也不同。因此在使用Map等数据类型的时候需要格外注意,避免使用GString作为Map的键。
字符
Groovy没有字符字面量。如果需要向Java方法传入单个字符的话,可以使用下面的方法进行转换。
def c2 = 'B' as char
assert c2 instanceof Character
def c3 = (char)'C'
assert c3 instanceof Character
布尔类型
Groovy的布尔类型和Java类似,也有true
和false
两个值。不过Groovy的布尔语义更丰富。未到结尾的迭代器、非空对象引用、非零数字都认为是真;空集合、空字符串等认为是假。详情参见Groovy文档 core-semantics#Groovy-Truth
数字类型
Groovy支持byte
、char
、short
、 int
、long
和 BigInteger
等几种数字类型。如果使用普通方式声明,它们和Java中的变量很相似。
int i = 4
BigInteger bi = 6
如果使用def
关键字声明,那么这些数字会自动选择可以容纳它们的类型。
def a = 1
assert a instanceof Integer
// Integer.MAX_VALUE
def b = 2147483647
assert b instanceof Integer
// Integer.MAX_VALUE + 1
def c = 2147483648
assert c instanceof Long
// Long.MAX_VALUE
def d = 9223372036854775807
assert d instanceof Long
// Long.MAX_VALUE + 1
def e = 9223372036854775808
assert e instanceof BigInteger
这些整数还可以添加0b
、0
和0x
前缀,分别代表8进制数,8进制数和16进制数。
另外Groovy还支持float
、double
和BigDecimal
三种浮点数类型。原理同上。还可以使用科学计数法1.123E10
这样的形式代表浮点数。
Groovy的数字常量同样支持后缀区分字面值类型,这几种类型和Java中的类似。唯一不同的是Groovy还支持G
和g
后缀,代表BigInteger或BigDecimal类型,根据字面值是否含有小数点来区分。
数学计算
数字的计算结果和Java规则类似:小于int的整数类型会被提升为int类型,计算结果也是int类型;小于long的整数类型和long计算,结果是long类型;BigInteger和其它整数类型计算,结果是BigInteger类型;BigDecimal和其它整数类型计算,结果是BigDecimal类型;BigDecimal和float、double等类型计算,结果是double类型。
列表
Groovy中的列表比较灵活,有点像Python中的列表。使用[....]
语法可以声明列表,默认情况下列表是ArrayList实现。我们也可以使用as
运算符自己选择合适的列表底层类型。
def arrayList = [1, 2, 3]
assert arrayList instanceof java.util.ArrayList
def linkedList = [2, 3, 4] as LinkedList
assert linkedList instanceof java.util.LinkedList
有了列表之后,就可以使用它了。使用方法和Python差不多。我们使用[索引]
引用和修改列表元素。如果索引是负的,则从后往前计数。要在列表末尾添加元素,可以使用左移运算符<<