groovy语法入门

2018-11-09

看了一些gradle构建脚本的教程,总感觉缺少了点什么,对于某些命令的写法不熟悉甚至看不懂,补一下groovy的基础知识。文章内容参考 http://groovy-lang.org/syntax.html (官网) 和 http://ifeve.com/groovy-syntax (翻译)

注释
单行注释、多行注释、文档注释 和java一致
Shebang line

这个东西在Unix下被称为事务行,且允许脚本直接从命令行运行,前提是你应将安装了Groovy发布版,且在PATH中Groovy的命令行是可用的。

#!/usr/bin/env groovy
println "Hello from the shebang line"

其中#字符必须是第一个字符,任何缩进(空格、制表符)都会报错

Keywords
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
Identifiers 标识符
正常标识符

同java

引用字符串

引用标识符出现在一个点式表达式的点后面。例如,person.name表达式中的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"

Groovy提供了不同的字符串字面量。所有不同类型的字符串都被允许出现在点后面。

map.'single quote'
map."double quote"
map.'''triple single quote'''
map."""triple double quote"""
map./slashy string/
map.$/dollar slashy string/$

普通字符串和Groovy的GStrings有一些不同(有插值的字符串),正如在后者的情况下,插入的值被插入到最后的字符串中,以计算整个标识符:

def firstname = "Homer"
map."Simson-${firstname}" = "Homer Simson"

assert map.'Simson-Homer' == "Homer Simson"
字符串

文本文字以字符链的形式表示被称作字符串。Groovy可以让你实例化java.lang.String对象,也可以实例化GString(groovy.lang.GString),在其他编程语言中被称为插值字符串。

单引号字符串

单引号字符串是一系列被单引号包围的字符。

'a single quoted string'

单引号字符串是普通的java.lang.String,不支持插值。

字符串连接

所有Groovy字符串能使用+操作符连接:

assert 'ab' == 'a' + 'b'
三单引号字符串

三单引号字符串是一列被三个单引号包围的字符:

'''a triple single quoted string'''

三单引号字符串是普通的java.lang.String,不支持插值。 三单引号字符串是多行的。你可以使字符串内容跨越行边界,不需要将字符串分割为一些片段,不需要连接,或换行转义符:

def aMultilineString = '''line one
line two
line three'''

如果你的代码是缩进的,如类中的方法体,字符串将包括缩进的空格。Groovy开发工具包含一些剥离缩进的方法,使用String#stripIndent()方法,并使用String#stripMargin()方法,需要一个分隔符来识别文本从一个字符串的开始删除。 当创建一个如下字符串:

def startingAndEndingWithANewline = '''
line one
line two
line three
'''

你将要注意的是,这个字符串的结果包含一个换行转义符作为第一个字符。它可以通过使用反斜杠换行符剥离该字符:

def strippedFirstNewline = '''\
line one
line two
line three
'''
assert !strippedFirstNewline.startsWith('\n')
转义特殊字符

你可以使用反斜杠字符转义单引号,避免终止字符串:

'an escaped single quote: \' needs a backslash'

你能使用双反斜杠来转义转义字符自身:

'an escaped escape character: \\ needs a double backslash'

一些特殊字符使用反斜杠作为转义字符:

转义序列    字符
'\t'        tabulation
'\b'        backspace
'\n'        newline
'\r'        carriage return
'\f'        formfeed
'\\'        backslash
'\''        single quote (for single quoted and triple single quoted strings)
'\"'        double quote (for double quoted and triple double quoted strings)
双引号字符串

双引号字符串是一些列被双引号包围的字符:

"a double quoted string"

如果没有插值表达式,双引号字符串是普通的java.lang.String,如果插值存在则是groocy.lang.GString实例。 为了转义一个双引号,你能使用反斜杠字符:”A double quote: \””。

字符串插值

任何Groovy表达式可以在所有字符文本进行插值,除了单引号和三单引号字符串。插值是使用占位符上的字符串计算值替换占位符的操作。占位符表达式是被${}包围,或前缀为$的表达式。当GString被传递给一个带有一个String参数的方法时,占位符的表达式被计算值,并通过调用表达式的toString()方法以字符串形式表示。 这里是一个占位符引用局部变量的字符串:

def name = 'Guillaume' // a plain string
def greeting = "Hello ${name}"

assert greeting.toString() == 'Hello Guillaume'

而且任何Groovy表达式是合法的,正如我们在示例中使用算数表达式所见一样:

def sum = "The sum of 2 and 3 equals ${2 + 3}"
assert sum.toString() == 'The sum of 2 and 3 equals 5'

不仅任何表达式,实际上也允许${}占位符。语句也是被允许的,但一个语句等效于null。如果有多个语句插入占位符,那么最后一个语句应该返回一个有意义的值被插入占位符。例如,”The sum of 1 and 2 is equal to ${def a = 1; def b = 2; a + b}”字符串是被支持的,也能如预期一样工作,但一个好的实践是在GString占位符插入一个简单的表达式。

除了${}占位符以外,也可以使用$作为表达式前缀:

def person = [name: 'Guillaume', age: 36]
assert "$person.name is $person.age years old" == 'Guillaume is 36 years old'

如果在GString中你需要转义 或 或 {}占位符,使它们不出现插值,那么你只需要使用反斜杠字符转义美元符号:

assert '${name}' == "\${name}"
插入闭包表达式的特殊情况

到目前为止,我们仅仅看到在${}占位符中插入任意表达式,但一个闭包表达式标记的特殊情况。当占位符包括一个箭头${->},这表达式实际是一个闭包表达式,你可以把它看做一个前面紧靠美元符号的闭包:

def sParameterLessClosure = "1 + 2 == ${-> 3}"1assert sParameterLessClosure == '1 + 2 == 3'

def sOneParamClosure = "1 + 2 == ${ w -> w << 3}"2assert sOneParamClosure == '1 + 2 == 3'

(1)这是一个不携带参数的无参闭包
(2)这里的闭包携带一个java.io.StringWrite参数,你能使用<<追加内容。在这两处,占位符被嵌入闭包。

在外观上,定义一个表达式被插入看着有一些冗长,但闭包相比表达式有一个有趣的优势:延迟计算。
让我们思考如下示例:

def number = 11def eagerGString = "value == ${number}"
def lazyGString = "value == ${ -> number }"

assert eagerGString == "value == 1"2assert lazyGString == "value == 1"3)

number = 24assert eagerGString == "value == 1"5
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Groovy入门经典是一个唯一能够扩展Java平台的脚本语言,内容全面详尽,浅显易懂,易于选择性阅读。可以作为对Groovy语言感兴趣的计算机软件开发人员的参考书。需要的朋友们就赶紧来下载试试吧!   Groovy提供类似于Java的语法结构,本地化支持映射和列表、方法、类,闭包和构造器等结构。由于具有动态弱类型,以及无缝访问JavaAPI等特性,Groovy语言非常适合子开发中小型规模的应用程序。   相对于Java语言,Groovy语言的表述性更强,抽象程度更高。它使得应用程序开发更加快捷,提升了程序员生产力。Groovy语言可以用作应用程序的“黏合剂”,而不必实现复杂的数据结构和算法。   与Java代码比较起来,Groovy语言的另一个主要优势是,Groovy代码编写量相对小些。在一般情况下,Java代码过于复杂,难于理解和维护。这是因为Java需要大量的模板文件或者转换代码,而Groovy却不需要。   本书是有关Groovy的第一本正式出版物,作者KennethBarclay和JohnSavage介绍了Groovy开发的所有主要领域,并解释了这种创新性的编程语言给Java平台赋予的动态特性。阅读本书只要求具备Java编程的一般性知识。不管你是经验丰富的Java开发者,还是脚本语言的新手,都会得到如何充分利用Groovy语言的专家性指导。   本书特点第一本全面讲解Groovy编程的图书,演示如何快速和轻松地编写适用于Java平台的应用程序和脚本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值