Gradle构建-Groovy基础

接下来我们了解下Gradle所使用的Groovy语言

1.字符串

我们在Gradle中经常看到代码的结尾都没有分号,这是因为在Groovy中,结尾分号不是必须的,这是Groovy语法的特性。

单引号和双引号都可以定义一个字符串常量(Java中单引号代表定义一个字符),但是双引号可以做表达式运算

exp

task printStringVar << {
    def name = "张三"
    print('单引号的变量计算:${name}')//String类型
    print("双引号的变量计算:${name}")//GString类型,通过自动调用toString()返回
    
}

运行./gradlew printStringVar 输出结果

单引号的变量计算:${name}
双引号的变量计算:张三

通过这种嵌套规则,免去了Java中繁琐的+号了 ,只有一个变量可以免去花括号比如$name

Groovy整型和Java类似,如果使用def声明类型,那么整型是可变的,它会通过数值的大小来匹配类型。并且数值可以用_下划线对数字分组

  • byte
  • char
  • short
  • int
  • long
    *Java.lang.BigInteger
    浮点型 float double java.lang.BigDecimal
    Groovy没有明确的字符类型,通过以下三种方式可以创建
char c = 'A' //声明类型为char
def c2 = 'B' as char //通过as将类型强制指定为char
def c3 = (char)'C' //通过类型转换

2.集合

Groovy完全兼容Java集合,并进行了拓展,使得声明,迭代,查找集合等操作变得非常easy。常见的集合有List、Set、Map、Queue

  • 2.1 List
    Java定义List需要实现一个List接口的类,而Groovy就非常简单,
task printList << {
    def numList = [1,2,3,4,5]
    println numList.getClass().name
    println numList[1] // 和Java一样 访问第二个元素
    println numList[-1] //  访问最后一个元素
    println numList[-2] //  访问倒数第二个元素
    println numList[1..3] //  访问第二到第四个元素
//可以使用<<向list末尾追加元素。
numList << 6   
  numList.each {
        print it  // 迭代输出
    }
assert  [1,7,8].grep(numList ) ==[1] // 取交集
}
 for (i in numList[3 ..5]) { //迭代集合的第4-6个
        print i
    }

输出结果

Task :printList
java.util.ArrayList
2
5
4
[2, 3, 4]
123456
456

Groovy中,负下标表示从右开始,-1表示倒数第一个,以此类推 。中间通过两个..可以表示范围下标索引。
通过each表示迭代,通过一个闭包作为参数 it 表示正在迭代的元素,后面会详细讲解闭包的it用法

List中元素可以是不同类型,Groovy定义数组的方式和定义list的方式一样,只不过声明时需要制定类型,或者通过as来强制制定类型为Array。Groovy不支持Java数组的初始化方式。

String[] arrStr = ['Ananas', 'Banana', 'Kiwi']  
 
assert arrStr instanceof String[]    
assert !(arrStr instanceof List)
 
def numArr = [1, 2, 3] as int[]    
 
assert numArr instanceof int[]       
assert numArr.size() == 3
 
//多维数组
 
def matrix3 = new Integer[3][3]         
assert matrix3.size() == 3
Integer[][] matrix2                     
matrix2 = [[1, 2], [3, 4]]
assert matrix2 instanceof Integer[][]

List 实现快速排序

def quickSort(list){
    if(list.size() <2)
        return list
     def pivot = list[list.size().intdiv(2)]
     def left = list.findAll{item->item<pivot}
     def middle =  list.findAll {item->item==pivot}
     def right = list.findAll{item->item>pivot}
     return (quickSort(left)+middle+quickSort(right))
}
assert quickSort([]) == []
assert quickSort([1]) == [1]
assert quickSort([1,2]) == [1,2]
assert quickSort([2,1,3]) == [1,2,3]
assert quickSort([1.0f,'a',10,null]) == [null,1.0f,10,'a']
assert quickSort('Karin and Dierk') == '  DKaadeiiknnrr'.toList()
    1. Map
      Map跟Java一样 都是接受一个 K:V键值对 ,Groovy穿件的map默认类型为java.util.LinkedHashMap
task printlnMapBase << {
    def map = [ 'w': 1280, 'h':1920 ]
    println map['w']
    println map.w

    map.each {
        println "Key:${it.key},Value ${it.value}"
    }
 
def key = 'name'
def person = [key: 'Guillaume']     // key实际上为"key"
 
assert !person.containsKey('name')   
assert person.containsKey('key')  
 
person = [(key): 'Guillaume']    // key实际上为"name"
 
assert person.containsKey('name')    
assert !person.containsKey('key')
}

Map中通过[key]或.key的方式来获取key对应的value。如果key不存在,则返回null.
当我们使用数字作为key时,这个数字可以明确的认为是数字,并不是Groovy根据数字创建了一个字符串。但是如果以一个变量作为key的话,需要将变量用()包裹起来,否则key为变量,而不是变量所代表的值。


引用标识符是.(dot)后的表达式。比如说name是person.name的一部分,那么我们可以通过person."name"或者person.'name'来引用它。这点与Java不同,Java不允许这种格式的引用。eg:


def map = [:]
 
map."an identifier with a space and double quotes" = "ALLOWED"
map.'with-dash-signs-and-single-quotes' = "ALLOWED"

assert map."an identifier with a space and double quotes" == "ALLOWED"
assert map.'with-dash-signs-and-single-quotes' == "ALLOWED"
  • 3.方法
    Groovy 中方法括号是可以省略的(我们一般都省略),甚至返回值return都不用写
    assert 3 == method1(1,2)
    def value = method1 1,2
    assert value == 3

def method1(int a, int b) {
    println a+b
    a+b
}
    1. 闭包(closure)

在Android 的build.gradle 大量使用闭包closure

之前说的一个参数可以省略 ,通过it 返回迭代

如果是map的话,返回key 和value 一共两个参数 ,那么就不能使用it,需要显示声明出来。

    eachMap({ k,v ->
        println "${k} is ${v}"
    })

def eachMap(closure) {
    def map = ["name":"zhangsan","age":"18"]
    map.each {
        closure(it.key,it.value)
    }
}
输出:
name is zhangsan
age is 18

Groovy的闭包有thisObject、owner、delegate 三个属性

thisObject 默认就是上线文对象来处理闭包中调用的方法

委托(delegate)
closure的上下文是可以改变的,通过Closure#setDelegate()。这个特性非常有用:

def myClosure = {println myVar} //I'm referencing myVar from MyClass class
MyClass m = new MyClass()
myClosure.setDelegate(m)
myClosure()

class MyClass {
    def myVar = 'Hello from MyClass!'
}

output: Hello from MyClass!

在 《Android Gradle权威指南》 看到的委托实例

def person(Closure<Person> closure) { //Closure是groovy.lang下的一个抽象类 ,泛型为Person
    Person p = new Person()
    closure.delegate = p
    closure.setResolveStrategy(Closure.DELEGATE_FIRST)
    closure(p)
}

class Person {
    String name
    String age
    def dumpPerson() {
        println "name is ${name},age is ${age}"
    }
}

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

推荐阅读更多精彩内容