一、比较Java与Groovy
Groovy几乎100%兼容Java,除了task本身需要使用Groovy的DSL定义外
task taskname << { //Groovy语法 //或者Java语法 //或者两者混搭 }
对于简单的POJO(Plain Ordinary Java Object简单Java对象),Java需要写getter和setter方法,但是Groovy只需要如下代码:
class ProjectVersion{ Integer major //主版本号 Integer minor //次版本号 ProjectVersion(Integer major,Integer minor){ this.major = magor this.minor = minor } }
除此之外的特性还有:
在没有return的情况下,方法体最后一个表达式的值会作为返回值。
如果用==比较两个类的实例,在底层Groovy会调用equals()方法,避免空指针异常。
二、Groovy特性
1.assert断言
assert用来验证代码前置或者后置条件,编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
def version = 12 assert version == 12
def version = 12 assert version == 12 version++ assert version == 12
2.可选类型定义
Groovy并不强壮要求显示声明变量类型、方法参数或者返回值类型。可以使用def关键字进行简单的标示,运行时Groovy通过所赋的值分析其类型。
3.可选的括号
方法签名需要至少一个参数的话,则方法调用可以省略括号,这个特性被用来创建更自然的DSL语言。
initProjectVersion(1, 2) initProjectVersion 1, 2 println('Groovy is awesome!') println 'Groovy is awesome!'
4.字符串
第一种和第二种为单引号和双引号,和Java中的String类型相同。
第三种,使用三个引号包起来,这在多行文本中很有用(比如SQL语句),见代码:
def myString1 = 'This is a single-quoted String' def myString2 = "This is a double-quoted String" def myString3 = """ This is multiline String """
5.Groovy字符串(GString)
在Groovy中双引号字符串更为强大,可以和美元符号
$及花括号
{...}配
合使用,在运行时,Groovy会计算其中的表达式组成一个字符串,见代码:
def language = 'groovy' def sentence = "$language is awesome!" assert sentence == 'groovy is awesome!' println sentence def improveSentence = "${language.capitalize()} is awesome!" assert improveSentence == 'Groovy is awesome!' println improveSentence
6.集合API
List
在方括号中放入一串以逗号分隔的值,就可以初始化新的List,可以通过左移符号<<向List中添加新的符号。
def buildTools = ['Ant','Maven'] assert buildTools.getClass() == java.util.ArrayList assert buildTools.size() == 2 assert buildTools[1] == 'Maven' buildTools << 'Gradle' assert buildTools.size() == 3 assert buildTools[2] == 'Gradle' buildTools.each { content -> println content }
Map
处理Map比处理List更加容易,在方括号中放入一串用逗号分隔的键值对就可以创建新的Map
def inceptionYears = ['Ant' : 2000, 'Maven' : 2004] assert inceptionYears.getClass() == java.util.LinkedHashMap assert inceptionYears.size() == 2 assert inceptionYears.Ant == 2000 assert inceptionYears['Ant'] == 2000 inceptionYears << ['Gradle' : 2009] assert inceptionYears.size() == 3 assert inceptionYears['Gradle'] == 2009 inceptionYears.each{buildTool,year -> println "$buildTool was first released in $year" }