groovy语法系列之groovy与gradle初探

开发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中数据结构的使用会有更多的不同之处

你可能感兴趣的:(groovy语法系列之groovy与gradle初探)