一、概述
Gradle是一款优秀的构建系统工具,它是基于Groovy的DSL语言实现,Gradle在Android中具有很重要的位置,因此在学习Gradle之前,了解Groovy是必须的。
Groovy是基于JVM虚拟机的一种动态语言,与Java非常类似,因此Java学习者入门Groovy基本没有任何障碍,并且Groovy完全兼容Java。
1)Groovy之字符串
1、在Java中,每条语句都是以分号结束,但是在groovy中,分号不是必需的。
2、groovy中,单引号和双引号都可以定一个字符串常量(Java中单引号定义一个字符),不同的是单引号标记的是纯粹的字符串常量,而不是对字符串里的表达式做运算,但是双引号可以。例如如下:
task printString <<{
def str1 = ''
def str2 = ''
println '单引号: '+str1.getClass().name
println '双引号: '+str2.getClass().name
def name = "张山"
println '单引号变量: ${name}'
println "双引号变量: ${name}"
}
// 命令行中输入: gradle printString, 输出如下:
:printString
单引号: java.lang.String
双引号: java.lang.String
单引号变量: ${name}
双引号变量: 张山
2)Groovy之集合
集合在Java中是经常用到的,groovy完全兼容了Java中的集合,同时还进行了扩展。这里主要介绍下List和Map的基本用法,其他集合的使用可做参考。
2.1) List
在Groovy中,定义一个List非常简单,如下:
task printList << {
def numList = [1,2,3,4,5,6];
println numList.getClass().name
println numList[1] // 访问第二个元素
println numList.get(1) // 访问第二个元素
println numList[-1] // 访问倒数第二个元素
println numList[1..3] // 访问第二个到第四个元素
}
// 命令行中输入: gradle printList, 输出如下:
:printList
java.util.ArrayList
2
2
6
[2, 3, 4]
2.2) Map
Map用法和List很像,只不过它的值是一个K:V键值对。用法如下:
task printMap <<{
def map = ['width':1234, 'height':4321]
println map.getClass().name
println map['width']
map.each{
println "key: ${it.key}, value:${it.value}"
}
}
// 命令行中输入: gradle printMap, 输出如下:
:printMap
java.util.LinkedHashMap
1234
key: width, value:1234
key: height, value:4321
3) Groovy之方法
任何一门语言,方法都是不可缺少的部分,在groovy中,方法与Java有许多不同的用法,下面将一一讲解不同之处。
3.1) 括号可以省略
在Java中,调用一个方法为如下格式: func(parm1, parm2),
但是在groovy中,则要灵活多变,括号是可以省略的,例如如下:
task methodTest <<{
method(1, 2)
method 2,4
}
def method(int a, int b){
println a+b
}
// 命令行中输入: gradle methodTest, 输出如下:
:methodTest
3
6
3.2) return是可以不写的
在Groovy中,我们方法的返回值是可以不写return语句的,Groovy会把方法执行过程的最后一句代码作为其返回值。例如如下:
task returnMethod <<{
def max1 = method2(5, 2)
def max2 = method2(1, 3)
println "max1: ${max1}, max2: ${max2}"
}
def method2(int a, int b){
if(a>b){
a
}else{
b
}
}
// 命令行中输入: gradle returnMethod, 输出如下:
:returnMethod
max1: 5, max2: 3
3.3) 传递代码块
在groovy中,代码块也可以作为函数的参数,类似于传递一个函数指针。 如下:
task invokeMethod1 <<{
// 传递代码块
method1({
println "1-->method1"
})
// groovy中,最后一个参数是闭包(闭包下面会讲到),可以放到方法外面,如下:
method1(){
println "2-->method1"
}
// 方法的括号也可以省略,最后入下:
method1{
println "3-->method1"
}
}
def method1(def func){
func()
}
// 命令行中输入: gradle invokeMethod1, 输出如下:
:invokeMethod1
1-->method1
2-->method1
3-->method1
4) Groovy之闭包
闭包是groovy一个非常重要的特性,闭包可以让代码更加灵活、轻量、可复用。
闭包其实就是一段代码块,上面的传递代码块其实就是闭包的使用。
当闭包只有一个参数是,默认就是it,例如如下:
task helloClosure << {
customEach{
println it
}
}
def customEach(closure){
for(int i in 1..10){
closure(i)
}
}
// 命令行中输入: gradle helloClosure, 输出如下:
:helloClosure
1
2
3
4
5
6
7
8
9
10
当有多个参数,就不能用it了,我们需要把参数一一列出,如下:
task mapClosure << {
eachMap{
k, v -> println "${k} is ${v}"
}
}
def eachMap(closure){
def map = ["name": "张三", "age":18]
map.each({
closure(it.key, it.value)
})
}
// 命令行中输入: gradle mapClosure, 输出如下:
:mapClosure
name is 张三
age is 18
到此,我们简单的介绍了groovy的基本语法,想系统的去学习,可以参考 Groovy教程
参考文献
《Android+Gradle权威指南》