Groovy是一门基于JVM的语言,它既支持类似Java面向对象的开发方式,也支持脚本方式编写和运行,Groovy吸收了Python、Ruby等许多语言的特性,引入了大量语法糖简化代码的编写,支持动态类型和闭包语法。此外,Groovy还具备与Java完全兼容的互操作性,同一个工程两种语言可以同时使用。由于Groovy的灵活性,Gradle配置一般使用GroovyDSL来编写,其中的build.gradle
等配置其实都是Groovy脚本。这篇笔记我们简单学习了解Groovy语言。
首先我们要知道的是,Groovy完全兼容Java语法,以下介绍的内容都是在Java的基础上进行补充。
;
可以省略,依靠换行符区分。def s = "Hello, world!"
println s
static def sayHello(n, s) {
for (i in 1..n) {
println s
}
}
sayHello 3, "Hello, world!"
def
关键字声明变量,而非使用具体的类型,变量的类型会自动推导,方法返回值也同理。def s = "abc123"
s = true
println s
默认类、成员函数、成员变量都为public
修饰(这与Java不同,Java为默认为default
)。
以下三种对象属性的读取方式等价。
User u = new User();
println u.stuName
println u["stuName"]
println u.getStuName()
class Actor {
def actName;
def age;
def desc;
}
def tom = new Actor(actName: "Tom", age: 18)
${}
占位符变量,三单引号不支持变量但支持换行,三双引号则既支持变量也能换行。实际上,纯字符串是String
类型,占位符字符串是GString
类型。此外,大括号在不引起歧义的情况下也可以省略。def msg = "Hello, world!";
def s1 = '${msg}'
def s2 = "${msg}"
def s3 = '''
Title: Hello
Content: ${msg}
'''
def s4 = """
Title: Hello
Content: $msg
"""
def
默认会定义基本类型的包装类型,即def i = 1
中变量i
为Integer
类型,而非int
。我们也可以直接在字面量上调用方法。def s = 65535.toString()
.groovy
源代码文件有类和脚本的区别,标准的类和Java使用方法相同;脚本则不同,其中代码可以不是标准的类定义,甚至可以不存在类定义。
类文件Main.groovy
:
class Main {
static void main(String[] args) {
println "Hello, world!"
}
}
脚本文件demoscript.groovy
:
class Student {
def name
def age
}
def s = new Student(name: 'Tom', age: 18)
println s.name
Groovy默认引入了一些常用包,我们不需要重复写import
声明。
import java.lang.*
import java.util.*
import java.io.*
import java.net.*
import groovy.lang.*
import groovy.util.*
import java.math.BigInteger
import java.math.BigDecimal
Groovy中,闭包使用大括号来定义。闭包对象可以理解为不是一个单纯的变量或某种对象实例,而是一个可执行的代码块。我们可以将闭包像变量一样传入函数或另一个闭包中来执行。
static def fetchData(onSuccess, onFailure) {
def client = new Client()
def result = client.getResult()
if (result.code == 0) {
onSuccess result.data
} else {
onFailure()
}
}
def success = { msg ->
println "Fetch data success! msg: ${msg}"
}
def failure = {
println "fetch data failed!"
}
fetchData(success, failure)
上面代码中,success
和failure
为两个闭包对象。
此外,闭包反过来也支持委托函数,下面是一个例子。
def closure = {
init()
println "Hello, world!"
destroy()
}
class Foo {
def init() {
println "System init..."
}
def destroy() {
println "System exit..."
}
}
closure.delegate = new Foo()
closure()
输出例子如下。
System init...
Hello, world!
System exit...