Gradle系列(一) Groovy 基础

1. 前言

准备写一个新的系列,专一于Gradle,计划会有以下几篇文章html

  1. Groovy 基础
  2. Gradle 执行顺序和task
  3. Gradle 差别化包
  4. Gradle 插件

2. 什么是Groovy

在学习Gradle以前,须要简单普及一下Groovy的语言基础.Groovy是一门jvm语言,特定领域的语言,里面的水特别深.咱们不须要所有记住和掌握,只须要记得一些经常使用的,不清楚的马上去查API 文档.java

Groovy官方文档bash

由于目前Android的主流构建工具是用的Gradle,而Gradle使用时就须要用到Groovy,还有Gradle DSL和Android DSL.Gradle里面其实东西比较多.随便说几个,好比渠道包(差别包),AOP,插桩,热修复,插件化等等,都须要用到Gradle.因此咱们Android开发人员对于Gradle的需求很是大.有必要搞清楚.闭包

3. 简单使用Groovy

打开Android Studio,随便新建一个Android项目.点击顶部Tools->Groovy Console便可,这时AS会出来一个窗口,专门拿来运行那种临时的Groovy代码的.由于是在本地执行,因此执行速度会很是快.写好代码后点击窗口左上角的三角按钮便可运行代码.jvm

4. 语法

droovy的语法比java简洁不少函数

4.1 简单示范

int r = 1
def a = 1
a = 'da'
println(a)

def b = "dasa"
def c = 56.4

//调用下面的test方法
def d = test()
println(d)
def test() {
    println("test method")
    return 1
}

//输出
da
test method
1
复制代码
  • groovy中不用写分号
  • 变量类型能够省略
  • 方法返回类型能够省略,上面test方法中的return也能够省略
  • 变量类型比较弱,能够推断出来
  • 字符串能够用双引号或者单引号包起来

4.2 String

def name = "zhangsan"
def b = 2

def test(a, b) {
    println("a=${a} b=${b}")
}

test(name, b)

//输出
a=zhangsan b=2
复制代码
  • String中若是须要使用到变量,则须要使用$和{}关键字,而且须要使用双引号的时候才能这样用
  • 能够看到方法的入参那里也能够省略类型
  • Java中String有的方法,它都有

4.3 闭包

闭包感受有点像kotlin的高阶函数(不知道对不对),能够将一个闭包做为参数传入方法,也能够赋值给变量.而后调用call方法便可调用闭包.kotlin是调用invoke.工具

//定义闭包      闭包的参数
def closure = { int a, String b ->
    println("a=${a} b=${b}")
    //闭包返回值
    return a + b
}
//调用闭包   定义result变量不用写def也能够,666
result = closure.call(1, "name")
println(result)

//输出
a=1 b=name
1name
复制代码
  • 闭包使用call方法调起,须要传入参数
  • 闭包定义时的参数类型是能够省略的

4.4 List

比Java中的更增强大.当遇到不会的方法的时候去查API文档,好比下面的示例代码中的each闭包,你确定不知道闭包的参数是什么,这时咱们打开,List的文档地址,找到each方法,知道了原来是遍历每一个元素,参数是每一个元素.学习

//list 能够存放不一样的数据类型
def list = [1, "test", true, 2.3]
list.each { item ->
    println(item)
}

list.each {
  println(it)
}

//输出
1
test
true
2.3
复制代码
  • 闭包的参数只有一个时是能够省略的,在里面使用时用it代替.和kotlin很像.
  • list支持list[1]这种形式的访问

4.5 Map

//空的map
def map1 = [:]
//
def map = ["id":1, "name":"xfhy"]

map['id'] = 2
println(map['id'])

map.id = "idStr"
println(map.id)

map.each { key, value ->
    println("key=${key} value=${value}")
}

map.each { entry ->
    println(entry)
}

//输出
2
idStr
key=id value=idStr
key=name value=xfhy
id=idStr
name=xfhy
复制代码
  • map支持map['id']访问和赋值
  • 也支持map.id访问和赋值
  • each遍历支持2种闭包,使用方式如上,记不清楚不要紧,使用的时候去查API就行

4.6 IO

groovy的文件操做也是很是很是好使ui

def file = new File("D:/test.txt")
file.eachLine { line, lineNo ->
    println("第${lineNo}$line")
}

//输出
第1行 name
第2行 age
第3行 book
复制代码
  • 很是好用,简单直接地读取文件内容
  • 其余好用的API,请参阅这里

4.7 类

class Book {
    String bookName
    double price
}

def book = new Book()
book.with {
    bookName = '字典'
    price = 24.5
}
println(book.bookName)
println(book.price)
book=null
println(book?.price)


//输出
字典
24.5
null
复制代码
  • 使用with操做符,能够对book对象内部属性进行操做,调用方法等
  • 使用?能够避免空指针,省得判空.就像kotlin同样,很棒.

5. 总结

我我的认为,基础掌握差很少这么多就好了,剩下的遇到了再查官方文档.spa