介绍
Groovy 是一种基于 JVM 的敏捷开发语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性。
Groovy 主要的特点包括:
- 是一个基于 Java 虚拟机的敏捷动态语言。
- 构建在强大的 Java 语言之上 并添加了从 Python、Ruby 和 Smalltalk 等语言中学到的诸多特征。
- 为 Java 开发者提供了现代最流行的编程语言特性,而且学习成本很低(几乎为零)。
- 支持 DSL(Domain Specific Languages领域定义语言)和其它简洁的语法,让你的代码变得易于阅读和维护。
- Groovy 拥有处理原生类型,面向对象以及一个 Ant DSL,使得创建Shell Scripts变的非常简单。
- 在开发 Web,GUI,数据库或控制台程序时 通过减少框架性代码 大大提高了开发者的效率。
- 支持单元测试和模拟(对象),可以简化测试。
- 无缝集成 所有已经存在的 Java 对象和类库。
- 直接编译成 Java 字节码,这样可以在任何使用 Java 的地方使用 Groovy 。
语法
语法特性
语句
-  语句不需要分号表示结束 
-  return 关键字可省略,方法的最后一句表达式可作为返回值返回 
-  导航操作符 ( ?.)可帮助实现对象引用不为空时方法才会被调用
-  可以给参数设置默认参数 
class Student {static void main(String[] args){println getMax(5);}   static def getMax(a,b=2){if(a > b){1;}else {0;}}
}
变量定义
如果是使用内置变量类型定义的变量,一经定义,后面是不可以更改变量类型的。但是Groovy也提供了类似javascript中的any定义任意变量类型的关键字def。而且不需要强制指定类型
task testGroovy() {def i = 1           //不需要指定类型println(i)
}
定义类
Groovy兼容Java,定义类就和Java一样了,类中成员变量会隐式生成get/set方法,最后观察打印方法的调用,在Groovy中方法调用可以省略"()"。
默认类和方法是public,字段是private
task testGroovy() {// 类中字段赋值Project p = new Project("groovy", "1.0.0", "jvm")// 打印版本号println p.version
}class Project {//自动生成get/setString nameString versionString groupProject(String name, String version, String group) {this.name = namethis.version = versionthis.group = group}
}
字符串
Groovy有三种定义字符串的方式:
task testGroovy2() {def s = 'hello'             //单引号println s
}
task testGroovy2() {def s1 = 'hello'def s2 = "$s1 groovy"    //双引号,支持变量。和kotlin一样,可以使用 $ 符号取变量值println s2
}
task testGroovy3() {// 三个单引号,可以换行def s = '''hello groovyissimple'''println s
}
集合
定义list时使用 [] ,使用 <<添加一个元素
task testGroovy4() {def list = ['one', 'two', 'three']            //定义 listlist << 'four'								//添加元素。println list[3]
}
map使用 : 隔开,区别key和value,也支持 <<添加一个元素
task testGroovy5() {def map = ['one': 1, 'two': 2, 'three': 3]map << ['four': 4]println map['four']println map.four
}
range
def list1 = 1..10   //从 1 到 10 
def list2 = 1..<10  //从 1  到 9
def list3 = 'a'..'x'  // 从 a 到 x
def list4 = 10..1    // 从10 到 1 
def list5 = 'x'..'a'
闭包
闭包是一个短的匿名代码块。每个闭包会被编译成继承 groovy.lang.Closure 类的子类,这个类有一个叫 call 方法,通过该方法可以传递参数并调用这个闭包。lambda表达式表示的变量,也就是函数类型变量
task testGroovy6() {def print1 = { message ->                   // lambdaprintln "$message end"}print1 "hello"
}
循环
// 第一种循环:eachdef list = [1,2,3,4,5]list.each {println it}// 第二种循环:infor  ( i  in  0..2 ) {println("hello Groovy")}// 第三种循环3.times {println("hello Groovy")}// 第四种循环0.upto(2) {println("hello Groovy")}// 除此之外,java的while也支持正则
def reg1 =~ 'he*llo'
def reg2 = /he*llo/
println "类型是: ${reg1.class}"          // 类型是: java.util.regex.Pattern
println "类型是: ${reg2.class}"          // 类型是: java.lang.String
println "hello".matches(reg1)            // true
println "hello".matches(reg2)            // true- =~可以得到- java.util.regex.Matcher
- ==~可以得到布尔类型
def val1 = "hello" =~ "he*llo"            //左边是变量,右边是正则
println val1.class                        // java.util.regex.Matcher
print val1.matches()                      // truedef val2 = "hello" ==~ "he*llo"
print val2                                // trueTraits 特征
Scala 等语言更有详细描述。
with语法(闭包实现)
Groovy 中的这个 with 方法跟 Kotlin 中的 apply 方法类似,它使用了闭包:
class Name {String firstName;String secondNamestatic void main(String[] args) {def name = new Name()name.with {firstName = "XXXX"secondName = "YYYYY"println "$firstName $secondName"}}
}
在 with 方法中的这个闭包,可以直接使用 firstName 这个成员变量,也可以使用内部中的 public 方法。
委托
上述 with 方法之所以能够调用对象中的成员变量和方法,是因为它改变了委托策略。
闭包中的委托有三个重要的概念,它们分别是 this \ owner \ delegate。它们的区别是:
- this:闭包定义处 外部的类 或者 这个类 对象。
- owner:闭包定义处 外部的类或者类对象 或者外层的闭包对象
- delegate:可以是任何对象,默认- owner
命令链功能
Groovy 可以省略顶级语句方法调用中参数外面的括号。命令链功能则将这种特性继续扩展,它可以将不需要括号的方法调用串接成链,既不需要参数周围的括号,链接的调用之间也不需要点号
//没有参数的必须加括号
//每个方法都必须返回 this,类似于builder模式。
methodA a,b  methodB c  methodC()  methodD d,e,f 
数据类型
- byte-这是用来表示字节值。例如2。
- short-这是用来表示一个短整型。例如10。
- int-这是用来表示整数。例如1234。
- long-这是用来表示一个长整型。例如10000090。
- float-这是用来表示32位浮点数。例如12.34。
- double-这是用来表示64位浮点数,这些数字是有时可能需要的更长的十进制数表示。例如12.3456565。
- char-这定义了单个字符文字。例如“A”。
- Boolean-这表示一个布尔值,可以是true或false。
- String-这些是以字符串的形式表示的文本。例如,“Hello World”。
数值类型的数值范围与Java一致。
运算符
算术运算符:+、-、*、/、%、++、--
关系运算符:==、!=、>、>=、<、<=
逻辑运算符:&& || !
位运算符:& | ^ ~
赋值运算符: += -= *= /= %=
范围运算符:..
三元预算法:?: (def result = a != null ? a : "name" 简化成 def resultA = a ?: "name")
Groovy 中的
==操作符等价于使用equals方法,该方法可以复写,地址比较用is方法
一切皆可转化为Boolean
任何为 null、Void的对象,或者等同于 0 或者为 null 的值,都会被解析为 false,反之则为 true。
所以一般对 String 判断可以从 str != null && str.length() > 0 可以改为 !str。
参考
API文档
下载地址
在线编程
常用类
Json
groovy.json.JsonOutput