Groovy语法入门
Gradle文件其实使用Groovy脚本写的,对于Android开发者来说,入门Groovy非常简单。
主要需要了解以下几点。
调用至少包含一个参数的方法时不需要使用括号
def printAge(String name, int age) {
print("$name is $age years old")
}
def printEmptyLine() {
println()
}
def callClosure(Closure closure) {
closure()
}
printAge "John", 24 // Will print "John is 24 years old"
printEmptyLine() // Will, well, print empty line
callClosure { println("From closure") } // Will print "From closure"
如果方法的最后一个参数是闭包(或者说是lambda表达式),可以写在括号外
(注:这个特性很重要,gradle文件中的很多配置其实都是参数为闭包的方法)
def callWithParam(String param, Closure<String> closure) {
closure(param)
}
callWithParam("param", { println it }) // Will print "param"
callWithParam("param") { println it } // Will print "param"
callWithParam "param", { println it } // Will print "param"
对于Groovy方法中命名过的参数,会被转移到一个map中做为方法的第一个参数,那些没有命名的参数则加在参数列表之后
def printPersonInfo(Map<String, Object> person) {
println("${person.name} is ${person.age} years old")
}
def printJobInfo(Map<String, Object> job, String employeeName) {
println("$employeeName works as ${job.title} at ${job.company}")
}
printPersonInfo name: "John", age: 24
printJobInfo "John", title: "Android developer", company: "Tooploox"
这段程序会打印“John is 24 years old”和“John works as Android developer at Tooploox”,方法调用的参数可以是乱序的,map会被作为第一个参数传入!这里的方法调用也省略了括号。
闭包
闭包是一个非常重要的特性,需要解释一下。闭包可以理解为lambada。他们是一段可以被执行的代码,可以有参数列表和返回值。我们可以改变一个闭包的委托
class WriterOne {
def printText(str) {
println "Printed in One: $str"
}
}
class WriterTwo {
def printText(str) {
println "Printed in Two: $str"
}
}
def printClosure = {
printText "I come from a closure"
}
printClosure.delegate = new WriterOne()
printClosure() // will print "Printed in One: I come from a closure
printClosure.delegate = new WriterTwo()
printClosure() // will print "Printed in Two: I come from a closure
我们可以看到printClosure调用了不同委托的printText方法,之后会解析这个特性在gradle中的重要性。