Gradle作为一个构建工具自然不会自己去创造一门语言来支撑自己,那么它用的是哪门子语言呢?什么语言能写成这样:

task hello {doLast {println 'Hello world!'}
}

如此风骚的语法自然要归Groovy莫属了。

什么是Groovy

官方介绍如下:

Apache Groovy is a powerful, optionally typed and dynamic language, with static-typing and static compilation capabilities, for the Java platform aimed at improving developer productivity thanks to a concise, familiar and easy to learn syntax. It integrates smoothly with any Java program, and immediately delivers to your application powerful features, including scripting capabilities, Domain-Specific Language authoring, runtime and compile-time meta-programming and functional programming.

大概意思是Groovy是一门运行在java平台上的强大的、可选类型的、动态语言。使用Groovy可以使你的应用具备脚本,DSL定义,运行时和编译时元编程,函数式编程等功能。

接下来将分几个小节简单介绍Groovy的语法规范。

Groovy语法

注释

Groovy使用的注释有一下几种:

1.单行注释

// a standalone single line commentprintln "hello" // a comment till the end of the line

2.多行注释

/* a standalone multiline commentspanning two lines */println "hello" /* a multiline comment startingat the end of a statement */println 1 /* one */ + 2 /* two */

3.文档注释

/*** A Class description*/class Person {/** the name of the person */String name    /*** Creates a greeting method for a certain person.** @param otherPerson the person to greet* @return a greeting message*/String greet(String otherPerson) {       "Hello ${otherPerson}"}
}

4.组织行

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

这类脚本注释主要用于表明脚本的路径。

字符串

单引号字符串

单引号字符串对应java中的String,不支持插入。

'a single quoted string'

字符串连接

assert 'ab' == 'a' + 'b'

三引号字符串

'''a triple single quoted string'''

三引号字符串同样对应java中的String,不支持动态插入。三引号字符串支持多行:

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

转义

Groovy中使用\来进行转义

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

双引号字符串

"a double quoted string"

如果双引号字符串中没有插入表达式的话对应的是java中的String对象,如果有则对应Groovy中的GString对象。

Groovy中使用${}来表示插入表达式,$来表示引用表达:

def name = 'Guillaume' // a plain stringdef greeting = "Hello ${name}"assert greeting.toString() == 'Hello Guillaume'
def person = [name: 'Guillaume', age: 36]assert "$person.name is $person.age years old" == 'Guillaume is 36 years old'
shouldFail(MissingPropertyException) {println "$number.toString()"}

插入闭包表达式

def sParameterLessClosure = "1 + 2 == ${-> 3}" assert sParameterLessClosure == '1 + 2 == 3'def sOneParamClosure = "1 + 2 == ${ w -> w << 3}" assert sOneParamClosure == '1 + 2 == 3'
def number = 1 def eagerGString = "value == ${number}"def lazyGString = "value == ${ -> number }"assert eagerGString == "value == 1" assert lazyGString ==  "value == 1" number = 2 assert eagerGString == "value == 1" assert lazyGString ==  "value == 2"

关于闭包,暂时先看看就行,等后面具体学习完闭包以后再回来看这几个表达式就简单了。

三双引号字符串

def name = 'Groovy'def template = """Dear Mr ${name},You're the winner of the lottery!Yours sincerly,Dave
"""assert template.toString().contains('Groovy')

斜杠字符串

Groovy也可以使用/来定义字符串,主要用于正则表达式

def fooPattern = /.*foo.*/assert fooPattern == '.*foo.*'
def escapeSlash = /The character \/ is a forward slash/assert escapeSlash == 'The character / is a forward slash'
def multilineSlashy = /onetwothree/assert multilineSlashy.contains('\n')
def color = 'blue'def interpolatedSlashy = /a ${color} car/assert interpolatedSlashy == 'a blue car'

/和//和/字符串

def name = "Guillaume"def date = "April, 1st"def dollarSlashy = $/Hello $name,today we're ${date}.$ dollar sign$$ escaped dollar sign\ backslash/ forward slash$/ escaped forward slash$/$ escaped dollar slashy string delimiter
/$assert [    'Guillaume',    'April, 1st',    '$ dollar sign',    '$ escaped dollar sign',    '\\ backslash',    '/ forward slash',        '$/ escaped forward slash',        '/$ escaped dollar slashy string delimiter'].each { dollarSlashy.contains(it) }

字符

单引号字符串如果只有一个字符会被转化成char类型。

列表

Groovy中列表使用[]表示,其中可以包含任意类型的元素:

def heterogeneous = [1, "a", true]

使用下标进行取值和赋值

def letters = ['a', 'b', 'c', 'd']assert letters[0] == 'a'     assert letters[1] == 'b'assert letters[-1] == 'd'    assert letters[-2] == 'c'letters[2] = 'C'             assert letters[2] == 'C'letters << 'e'               assert letters[ 4] == 'e'assert letters[-1] == 'e'assert letters[1, 3] == ['b', 'd']
assert letters[2..4] == ['C', 'd', 'e']

数组

Groovy中复用List来充当数组,但如果要明确定义真正的数组需要使用类似java的定义方法

String[] arrStr = ['Ananas', 'Banana', 'Kiwi']  assert arrStr instanceof String[]
assert !(arrStr instanceof List)def numArr = [1, 2, 3] as int[]      assert numArr instanceof int[]
assert numArr.size() == 3

键值数组

Groovy中键值数组使用如下

def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']   assert colors['red'] == '#FF0000'    assert colors.green  == '#00FF00'    colors['pink'] = '#FF00FF'           colors.yellow  = '#FFFF00'           assert colors.pink == '#FF00FF'assert colors['yellow'] == '#FFFF00'assert colors instanceof java.util.LinkedHashMap
本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1928053,如需转载请自行联系原作者

Groovy基本句法相关推荐

  1. Groovy中的闭包

    groovy中的一个核心语法:closurs,也叫闭包.闭包在groovy中是一个处于代码上下文中的开放的,匿名代码块.它可以访问到其外部的变量或方法. 1. 句法 1.1 定义一个闭包 { [clo ...

  2. 平台多样化:Gavin Grover的Groovy之路

    最近,Gavin Grover将其开发的Groovy-DLR 1.0的beta 04版源码上传到了codeflex站点,该版本对以前的版本作出了一些改进,包括就地(in-place)注释lex定义. ...

  3. Idea groovy表生成实体类带注释

    Idea groovy表生成实体类带注释 1.点开datasourse,打开idea带的数据库工具,具体添加数据库连接,这里不描述. 这时点击会生成一个poji 这时生成的pojo中是不带中文注释的, ...

  4. groovy–流程控制

    在本篇文章中,我们将介绍逻辑分支,循环,以及如何从if-else以及try-catch代码块中返回值. if – else Groovy 支持Java传统的if-else语法: def x = fal ...

  5. groovy–运算符重载

    Groovy支持运算符重载,各种运算符被映射到普通的java对象的方法调用,这就使得开发者可以利用运算符重载的优势来编写自己的Java或者groovy对象. 下面的表格描述了groovy中的操作符所映 ...

  6. 便捷,轻巧的Groovy数据库操作

    本文主要介绍Groovy对数据的CRUD操作,熟悉groovy.sql包,测试使用的数据库是H2. 1.数据库连接配置 //数据库连接配置 def db = [url:'jdbc:h2:mem:gro ...

  7. parsing:NLP之chart parser句法分析器

    已迁移到我新博客,阅读体验更佳parsing:NLP之chart parser句法分析器 完整代码实现放在我的github上:click me 一.任务要求 实现一个基于简单英语语法的chart句法分 ...

  8. ElasticSearch Groovy脚本远程代码执行漏洞

    什么是ElasticSearch? 它是一种分布式的.实时性的.由JAVA开发的搜索和分析引擎. 2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由 ...

  9. 参加海峡两岸城市地理信息系统论坛2010 年会(一张图、规划信息化和空间句法的碎碎念)...

    上周末去清华建筑学院开了个会,叫做海峡两岸城市地理信息系统论坛2010 年会,主题很大,但是内容比较集中一些,就是围绕着GIS与城市规划.一天下来听了20个报告,挺佩服主办方的时间控制,这么密集的报告 ...

最新文章

  1. fixture详细介绍-作为参数传入,error和failed区别
  2. c 读取mysql 时间字段_MySQL中的时间字段的几种数据类型比较
  3. 列模式 文本编辑器_UltraEdit 24.2 文本编辑器免费版
  4. db2 sql执行历史_5 个免费的在线 SQL 数据库环境,比Navicat 香!
  5. ZOJ-3704 I am Nexus Master! 模拟
  6. 服务器无限火力时间,LOL十周年宣布无限火力开启时间 无限火力开启及持续时间详情...
  7. Oracle 归档模式
  8. TCP新手误区–粘包的处理
  9. LINUX编译opencore-amr
  10. 不小心中了makop勒索病毒
  11. 【IntelliJ IDEA】设置字体大小
  12. dataframe动态命名(读取不同文件并规律命名)
  13. Redhat_rhel8.0_DNS服务搭建步骤
  14. passwd_pro
  15. CAD如何调整线形比例?
  16. python回归取残差_R/python-回归分析
  17. 到底什么是JWT技术?
  18. 用DOS命令关闭端口
  19. swiftui视频_swiftui视频播放器实时处理核心图像
  20. Android关于虚拟控件、全面屏及悬浮球机型适配时遇到的问题

热门文章

  1. 实战 Prometheus 搭建监控系统
  2. 一款 PO VO DTO 转换神器
  3. 为什么不建议你用a.equals(b)判断对象相等
  4. 监控神器Prometheus用不对,也就是把新手村的剑
  5. MySQL:教你学会如何做性能分析与查询优化
  6. Redis是如何实现点赞、取消点赞的?
  7. Java并发编程73道面试题及答案——稳了
  8. SpringBoot第六篇:springboot整合mybatis
  9. 西部985,进军北京!
  10. 阿里工程师力荐的计算机网络和算法资料,限时下载!