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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,444评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,867评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,157评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,312评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,673评论 3 289
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,802评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,743评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,470评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,696评论 2 250
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,187评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,538评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,188评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,127评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,902评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,889评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,741评论 2 274

推荐阅读更多精彩内容