介绍
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 // true
Traits 特征
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