开发android都知道,groovy是编写gradle脚本的的核心语言,那要了解gradle之前,首先要了解groovy的语法结构,下面来说下groovy的基础语法:
groovy中变量说明:
由于是若语言,所以用def关键词定义,而且groovy语句结束后也不用分号结尾,并且有自动装箱的功能
def a1=3
println(a1.class)
//结果为java.lang.Integer
def a1=3.1
println(a1.class)
//结果为 java.math.BigDecimal
def a1='3.1'
println(a1.class)
//结果为class java.lang.String
可以看到groovy默认设置了自动装箱的功能,其实在定义变量时,groovy语言希望开发者用def关键字的,而在方法作为形参时,则不建议如此。
groovy中字符串:
单引号
def a1='studen \'s\'s'
println(a1)
//结果为studen 's's
用反斜杠代表转义字符
双引号
def sex='male'
def a1="my sex is ${sex}"
println(a1)
//结果为my sex is male
println(a1.class)
//结果为class org.codehaus.groovy.runtime.GStringImpl
可以看到可以在""中插入表达式,当然由于特殊性,它的类型不是String而是GString,当然这两个可以相互调用和传递
三引号
def a1='''aaa
bbb
ccc
'''
println(a1)
//结果为aaa
// bbb
// ccc
可以看到输出可以按照你输入的格式来输出
groovy中闭包:
闭包是groovy中特有的,有点类似于回掉,当然刚开始可能很难理解它,不过用多了就会对他爱不释手了,闭包的格式如下:
def a = {
println("hello word")
}
a.call()
// 结果如下hello word
可以看到可以把闭包a看成一个对象,然后里面有个call方法,调用了call方法就调用了类的call方法,也就是输出了hello word。
当然也可以直接调用
def a = {
println("hello word")
}
a()
// 结果如下hello word
也是可以的
另外,闭包这个特殊的“方法”是一定有返回值的,即使你不写return语句
def a = {
println("aaaa")
}
println(a.call())
// 结果如下
//aaaa
// null
可以看到无论是方法还是闭包在groovy中都是以最后一行表达式作为返回值的,如上代码最后一行是一个输出语句,返回值自然为null,如果把println去掉,返回值就是aaaa了
groovy中闭包参数:
当然,你也可以对于闭包定义相应的参数
def a = {
def sex ->
println("hello word ${sex}")
}
a.call("male")或者a("male")
// 结果为 hello word male
而groovy为了简化写法,可以把一个参数的用it表示
def a = {
println("hello word ${it}")
}
a.call(male)
// 结果为 hello word male
这样也是可以的,甚至
def a = {
println("hello word ${it}")
}
a.call()
// 结果为 hello word null
也不会报错,只是返回一个null而已
当然,如果是多个参数的话,编译器就会报错了
def a = {
def student,def sex->
println("hello word ${sex}")
}
a.call('male')
这样是不行的
当然,如果在方法参数里有闭包,而且是最后一个参数的话,方法中的闭包是可以写到外面的去的
println(getNumber(10))
def getNumber(int number) {
int totlaNumber = 0
number.downto(1) {
totlaNumber += it
}
return totlaNumber
// 结果为 55
}
这段代码其实就是在groovy中int类型的值,有个方法叫downto,调用如下
public static void downto(Number self, Number to, @ClosureParams(FirstParam.class) Closure closure) {
int self1 = self.intValue();
int to1 = to.intValue();
if (self1 < to1) {
throw new GroovyRuntimeException("The argument (" + to + ") to downto() cannot be greater than the value (" + self + ") it's called on.");
} else {
for(int i = self1; i >= to1; --i) {
closure.call(i);
}
}
}
可以看到,调用的闭包的参数是一个参数的,所以你定义闭包的时候只要写一个参数的即可,是一个类加的函数
输出结果就是1到10累加的值
groovy中闭包基本的方法
在groovy中,很多方法都与闭包做关联的,可以说是无处不在
例如String类中的each方法
def name="zhangshan"
name.each {
println(it+" ")
}
//结果为 z h a n g s h a n
输出的是zhangshan的每个字符
当然还有find方法
def name="zhAngs1han"
def result=name.find {
return it.isInteger()
}
println(result)
//结果为 1
其实就是遍历String中的值找符合条件的第一个值
找到了返回相应的值,找不到就返回null
当然类似的还有findall方法
def name="zhAngs1han"
def result=name.findAll {
return it.isInteger()
}
println(result.toListString())
//结果为 [1]
当然还有collect方法
def name = "zhAng1sahan"
def result = name.collect {
if (it.isNumber()) {
it += 1
}
return it
}
println(result)
//结果为[z, h, A, n, g, 11, s, a, h, a, n]
这里collect方法是表示把返回的值加到集合中,这里与each不同的是
each方法返回的是调用者的本身,而collect返回的是用for循环遍历过的list集合
总结:
groovy与java还是有很多相似地方的,主要不同在于闭包的使用,下一篇文章探讨groovy中数据结构的使用会有更多的不同之处