最近在学习 Android 中 Gradle 相关的知识,若是想学好 Gradle,必要的 Groovy 基础是不可少的。Groovy 语言的知识也是很是多的,若是只是想在 Android Gradle 这个范围内使用 Groovy,会 Groovy 的基础便可,Groovy 语言文档。html
Groovy 是从 Java 衍生出来的,Groovy 的源代码文件 .groovy
也是编译成为 .class 文件,而后运行在 JVM 虚拟机上的。其目标是,不论是做为脚本语言,仍是编程语言,均可以简单、直接的使用。在 Android 的 Gradle 中,Groovy 更多的是用于编写脚本。若是会 Java,学习 Groovy 会比较简单,甚至能够混写 Java 和 Groovy 语法。java
Groovy 相比 Java 语言来说,更加的方便灵活,更多的语法糖使编写 Groovy 代码更加的简洁,并且在 Groovy 中具备函数式编程的思想。好比:Groovy 中很是重要的闭包 Closure
概念(相似于 C 语言中的函数指针),能够当作一个函数也执行,也能够当作某个函数的参数传入到函数中去,也能够当作一个函数的返回值返回。android
想学好 Gradle,除了必要的 Groovy 知识基础之外,还须要了解其余两个基础知识:Android DSL 和 Gradle DSL。 DSL 是 Domain Specific Language(领域特定语言)的缩写,其定义是:针对某一领域,具备受限表达性的一种计算机程序设计语言。学习 Android Gradle,Android DSL 和 Gradle DSL 也是须要学习的,好在有官方的文档 Android DSL 文档 和 Gradle DSL 文档,学习起来就比较方便。在这篇文章中,不会过多地介绍 Android DSL 和 Gradle DSL,在下篇文章中会介绍。git
好了,废话很少说,接下来就来学习 Groovy 的语法基础吧。为了学习的时候,能够执行 gradle 脚本,请先在电脑上配置好 gradle 的环境变量,这样就能够方便地执行 gradle 脚本了。github
因为篇幅所限,本篇文章也只能做为一个引子,介绍基础的 Groovy 语言概念,详细的还须要从 Groovy 语言文档 学习。并且我我的认为,若是遇到什么不懂的、不会的,从官方文档上学习是最好的学习途径;或者至少先从官方文档上学习,再去学习其余的资料,将本身学习的和资料的进行对比思考,这样会更有助于我的的成长编程
为了不无心义的内容,只介绍和 Java 有区别的地方,相同的地方不做说明。数组
;
,可是若是一行声明了多个变量,变量与变量之间则不能够省略 ;
def
,def
只是声明了一个变量,变量的实际类型根据该变量的对象决定。def
和 JavaScript 中的 val
有点像,从 def
能够看出 Groovy 也是一门动态语言String
,可使用单引号 'String',也可使用双引号 "String"${}
作占位符表达式向字符串中插入值,在 {}
中写表达式或变量均可以,使用 ${}
的字符串必须使用双引号 ""int version = 1
Boolean isDebug = true
def language = 'groovy'
def message = "Hello from ${language + 1}, the result is ${isDebug}."
task hello {
doLast{
println message
}
}
复制代码
上面代码的执行输出是:bash
> Task :hello
Hello from groovy1, the result is true.
复制代码
[]
,而不是 Java 中的 {}
,防止和 Groovy 中的 闭包 Closure {}
混淆[index]
的方式修改和访问 List 中的元素<<
向 List 中添加元素,<<
实际是 leftShift()
方法[-1]
表示最后一个元素[index1, index2]
同时访问 List 中的多个元素,返回结果还是一个List[index1..index2]
一次性访问 List 中某个范围内的数组,返回结果也是一个 ListArrayList arrayList = ['arrayOne', 'arrayTwo', 'arrayThree']
LinkedList linkedList = ['linkedOne', 'linkedTwo', 'linkedThree']
List list = [1, 2, true]
def listDef = ['one', 2, true, 4, '5']
task helloList {
doLast {
println listDef
println arrayList
println linkedList
println list
println list[0]
println list[-1]
list << 4
println list[-1]
println list[1, 3]
println list[1..3]
}
}
复制代码
输出以下所示:闭包
> Task :app:helloList
[one, 2, true, 4, 5]
[arrayOne, arrayTwo, arrayThree]
[linkedOne, linkedTwo, linkedThree]
[1, 2, true]
1
true
4
[2, 4]
[2, true, 4]
复制代码
Groovy 中的数组和 Java 中的数组区别并不大,也不过多的作介绍app
[]
初始化,并不使用 {}
,防止和 Groovy 中的 闭包 Closure {}
混淆<<
向 Arrays 中添加元素String[] arrayStrings = ["one", "two", 'three'];
def arrayInts = [1, 2, 3] as int[]
task hello {
doLast {
println arrayStrings[0]
println arrayStrings[1]
println arrayStrings[-1]
// arrayStrings << 'four' // Arrays 不支持 <<
println arrayStrings
println arrayInts
}
}
复制代码
输出以下所示:
> Task :hello
one
two
three
[one, two, three]
[1, 2, 3]
复制代码
:
做为 key 和 value 的链接,而且以 ,
作为每一项的分隔符的[key]
和 .key
的形式访问或向 map 中赋值,访问的时候若是不存在该 key
,则会返回 null
()
def maps = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']
def mapNums = [1: 'one', 2: 'two', 3: 'three', 100: 'four']
def key = 'name'
def mapKey = [key: 'value']
def mapKey1 = [(key): 'value1']
task helloMaps {
doLast {
println maps['red']
println maps.green
maps['pink'] = '#FF00FF'
maps.yello = '#FFFF00'
println maps['pink']
println maps.yello
println maps.white
println mapNums[1]
println mapNums[100]
println mapNums[5]
println mapKey['key']
println mapKey['name']
println mapKey1['name']
}
}
复制代码
上述代码的输出是
> Task :app:helloMaps
#FF0000
#00FF00
#FF00FF
#FFFF00
null
one
four
null
value
null
value1
复制代码
Groovy 中的 Class 和 Java 中的 Class 区别并不大,主要有如下几个区别
public
修饰符的fields
没有被修饰符修饰的话,会自动成为一个 properties
,properties
是公有的,而且会自动生成该 properties
的 setter 和 getter 方法public
的类class Student {
def name
def age
private String work
public String lover
def Student(String name) {
this.name = name
}
}
task helloClass {
doLast {
def student = new Student('lijiankun24')
println student.name
println student.getAge()
println student.lover
// println student.getLover() // Student 中并无 getLover() 这个方法
// println student.getWork() // Student 中并无 getWork() 这个方法
}
}
复制代码
输出结果以下:
> Task :app:helloClass
lijiankun24
null
null
复制代码
Groovy 中的函数和 Java 中的函数并无太大的区别
return
返回值的话,函数的最后一行语句的执行结果做为值返回,可能返回值是个 null
def message = 'message'
def printMessage () {
println message
}
void printName(String name) {
println name
}
void printPerson(String name, age) {
println "The name is ${name} and the age is ${age}"
}
task helloFunction {
doLast {
println printName('xiaoming')
printPerson 'xiaoming', 20
// println printMessage() 会执行异常
}
}
复制代码
输出结果以下所示:
> Task :app:helloFunction
xiaoming
null
The name is xiaoming and the age is 20
复制代码
Closure
闭包 closure
是 Java 中没有的,也是须要重点学习的,学好 closure
对理解 Android 中的 Gradle 会有莫大的帮助
closure
的定义以下,其中 [closureParameters ->]
做为参数部分,是能够省略的{ [closureParameters -> ] statements }
复制代码
closure
实际上是 Groovy 中 groovy.lang.Closure
的一个类closure
能够访问闭包以外的变量closure
能够有三种调用方式,以下代码所示closure
的参数能够省略,默认是有个 it
参数的closure
也能够做为另外一个闭包 closure
的参数// 闭包能够访问闭包以外的变量
def message = 'closure is good'
def printMessage = {
println "The message is '${message}'"
}
// 闭包其实是一个 `groovy.lang.Closure` 类
Closure<Boolean> booleanClosure = {
return it == 'xiaoming'
}
// 闭包能够省略参数,默认有一个 `it` 的参数
def testClosure = {
println "I am a closure, the params is ${it}."
}
// 闭包能够有多个参数,参数能够指定类型,也能够不指定类型
def testClosureParams = { name, int age ->
println "I am a closure, the params is ${name}."
}
// 闭包能够做为另外一个闭包的参数
def paramsClosure = { name, closure ->
if (closure(name)) {
println 'The input name is xiaoming'
} else {
println 'The input name is not xiaoming'
}
}
task helloClosure {
doLast {
printMessage()
println booleanClosure('xiaoming')
println booleanClosure('test')
// 闭包的三种调用方式
testClosure 'xiaoming'
testClosure.call('xiaoming')
testClosure('xiaoming')
testClosureParams('xiaoming', 20)
// 闭包 booleanClosure 做为闭包 paramsClosure 的参数
paramsClosure('xiaoming', booleanClosure)
paramsClosure('test', booleanClosure)
// 能够在调用闭包的时候才去定义参数闭包的定义,使用很是方便简洁
paramsClosure('xiaoming', { name ->
name.toUpperCase() == 'XIAOMING'
})
}
}
复制代码
输出以下所示
> Task :app:helloClosure
The message is 'closure is good'
true
false
I am a closure, the params is xiaoming.
I am a closure, the params is xiaoming.
I am a closure, the params is xiaoming.
I am a closure, the params is xiaoming.
The input name is xiaoming
The input name is not xiaoming
The input name is xiaoming
复制代码
Groovy 的基础知识就是这么多,若是想学习更多的内容,建议学习 Groovy 文档