前言
刚学习Groovy时,我感觉Groovy的语法太随意了使人摸不着头脑,不过看完官方的语法介绍,总算摸着了一些门道。不过相对于Java显得太琐碎了。这着实让人很头疼。因此写这篇日记,来记录Groovy的点滴琐碎,以及一些自己的心得体会。本博客的不同于其他中文文档之处的是,我在亲自试验的基础上总结而来。不同于按照英文单词对照翻译。很大一部分是自己的想法,如有不当之处,还请批评指正!O(∩_∩)O谢谢
这篇文章的知识来源于两方面:一方面是官方文档;一方面是网络教程;
知识来源:
1. Groovy官方知识库: Groovy官方知识库
关于Groovy官方知识库,我找到了一个中文版,不过翻译的不全,同样还是感谢作者的辛勤劳动。Groovy官方知识库中文版
2. 网络教程:
语法
语法syntax官方规范
《Groovy语言规范》-语法中文版
1. 注释
这部分和Java没有区别。不再赘述。
2.关键字
as | assert | break | case |
---|---|---|---|
catch | class | const | continue |
def | default | do | else |
enum | extends | false | finally |
for | goto | if | implements |
import | in | instanceof | interface |
new | null | package | return |
super | switch | this | throw |
throws | trait | true | try |
while | - | - | - |
3. 标识符
3.1 普通标识符
Groovy关于标识符的规范与Java差不错。不过有一点需要指出的是:
当关键字前跟有点(.)作为标识符时是有效的。例如:
foo.as
foo.assert
foo.break
foo.case
foo.catch
至于应有,现在举个例子:
def person=[as: “dabao”] //这是一个map集合。稍后会介绍。
println person.as; //在这里引用as,其作为标识符是有效的。
3.2 标识符的引用
标识符的引用是通过点号+标识符。引用方式有多种,不过有一条原则,即点号后只要是字符串(字符串的表示方式有很多)或者没有引号都可以:
person.name或者 person.”name” 或者person.’name’.
举个例子:
def map = [:]
map."an identifier with a space and double quotes" = "ALLOWED"
map.'with-dash-signs-and-single-quotes' = "ALLOWED"
assert map."an identifier with a space and double quotes" == "ALLOWED"
assert map.'with-dash-signs-and-single-quotes' == "ALLOWED"
或者:
map.'single quote'
map."double quote"
map.'''triple single quote'''
map."""triple double quote"""
map./slashy string/
map.$/dollar slashy string/$
甚至带有插入值的字符串都是可以的,例如:
def firstname = "Homer"
map."Simson-${firstname}" = "Homer Simson"
assert map.'Simson-Homer' == "Homer Simson"
4.字符串
初识Groovy的字符串会使人迷惑,不过仔细理解一下还是很有道理的,字符串是本文的重点,理解为要!
Groovy允许你实例化java.lang.String也允许你实例化groovy.lang.GString,后者在其他语言中通常被称作插值字符串。现在不懂插值字符串没关系,稍后见的多了就懂了。
4.1. 单引号字符串Single quoted string
Single quoted strings are a series of characters surrounded by single quotes:
单引号字符串是被单引号包裹起来的字符串:
'a single quoted string'
单引号字符串是 java.lang.String ,不支持插值。
4.2. 拼接字符串String concatenation
在Groovy中所有的字符串都支持拼接,通过加号:
assert 'ab' == 'a' + 'b'
4.3.三个单引号括起来的字符串 Triple single quoted string
三个单引号括起来的字符串是两端分别被三个单引号括起来的字符串:
'''a triple single quoted string'''
三个单引号括起来的字符串 是java.lang.String ,不支持插值。
三个单引号括起来的字符串可以跨行,不需要连接,或换行转义符:
def aMultilineString = '''line one
line two
line three'''
注意:在每一行的末尾添加分隔符\会忽略换行例如:
def strippedFirstNewline = '''\
line one
line two
line three
'''
4.3.1.转义特殊字符Escaping special characters
例如:单引号双引号…..使用\转移,防止阻断。
'an escaped single quote: \' needs a backslash'
'an escaped escape character: \\ needs a double backslash'
Some special characters also use the backslash as escape character:
例如:’\t’ 代表制表符,其他的不再一一列举,可以去官网查看。
4.3.2.Unicode转义字符传 Unicode escape sequence
例如:
'The Euro currency symbol: \u20AC'
4.4. 双引号字符串Double quoted string
"a double quoted string"
如果没有插值表达式,双引号字符串是普通的java.lang.String,如果插值存在则是groocy.lang.GString实例。
4.4.1. 字符串插值String interpolation
重点来了,这才是GString不同于java.lang.String的地方
def name = 'Guillaume' // a plain string
def greeting = "Hello ${name}"
assert greeting.toString() == 'Hello Guillaume'
也支持数学表达式:
def sum = "The sum of 2 and 3 equals ${2 + 3}"
assert sum.toString() == 'The sum of 2 and 3 equals 5'
表达式必须要带大括号,至于标识符可以不带大括号,但是该标识符后面不可以紧跟其他字符或者是结尾。如下也是可行的:
def name = 'Guillaume' // a plain string
def greeting = "Hello $name"
assert greeting.toString() == 'Hello Guillaume'
同样美元符号$也是可以转义的。
4.4.2.插入闭包表达式的特殊例子 Special case of interpolating closure expressions
至于什么是闭包,以后会涉及。如果觉得难以理解这一小节可以先跳过。
至今,我们看到可以将任意的表达式插入 占位符,但是还