Groovy 是一种基于 JVM
的敏捷开发语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性。
Groovy 主要的特点包括:
DSL
(Domain Specific Languages
领域定义语言)和其它简洁的语法,让你的代码变得易于阅读和维护。DSL
,使得创建 Shell Scripts
变的非常简单。语句不需要分号表示结束
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/set
String name
String version
String group
Project(String name, String version, String group) {
this.name = name
this.version = version
this.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
groovy
is
simple
'''
println s
}
定义list
时使用 []
,使用 <<
添加一个元素
task testGroovy4() {
def list = ['one', 'two', 'three'] //定义 list
list << '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 -> // lambda
println "$message end"
}
print1 "hello"
}
// 第一种循环:each
def list = [1,2,3,4,5]
list.each {
println it
}
// 第二种循环:in
for ( 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() // true
def val2 = "hello" ==~ "he*llo"
print val2 // true
Scala 等语言更有详细描述。
Groovy 中的这个 with 方法跟 Kotlin
中的 apply
方法类似,它使用了闭包:
class Name {
String firstName;
String secondName
static 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
方法
任何为 null
、Void
的对象,或者等同于 0 或者为 null
的值,都会被解析为 false
,反之则为 true
。
所以一般对 String
判断可以从 str != null && str.length() > 0
可以改为 !str
。
API文档
下载地址
在线编程
groovy.json.JsonOutput