Gradle学习(1) —— Groovy语言学习
《论语.魏灵公》:"工欲善其事,必先利其器。" Gradle作为主流Android开发IDE-AndroidStduio 的构建工具,也是我们Android工程师需要了解一门知识。 在认识Gradle之前,我们先来认识Gradle的语言Groovy.
一、前言
在AndroidStudio之前,我们常用的构建工具有Ant、Maven。Ant是之前java最流行的构建工具,Maven第一次支持了网络下载功能,专注于库的依赖。但是他们都是用XML作为配置文件格式,很难实现差异项目的构建。而Gradle的特点就是它是一种DSL,即Domain Specific Language,领域相关语言。也就是行话。行话要求在这个行业里的人一听就懂,一看就明白,不需要解释。这也正是Gradle 选择Groovy的原因。据说Gradle后续还会支持更多的语言
二、认识Groovy
Groovy基于Java并扩展了Java。Java程序员可以无缝切换到使用Groovy开发程序。在Groovy脚本运行时,groovy会先将其编译成javaclass,然后通过jvm运行。
在Groovy中除了可以直接使用的JDK 外,还有自己的一套
GDK,如果需要可以去查阅。
2.1基本认识
2.1.1 注释
//像JAVA一样
/*像JAVA一样*/
2.1.2 Groovy语句可以不以分号结尾
2.1.3 支持动态类型
def value1=1
def str="abc"
def String str="def"
def int i=0
2.1.4 函数无需指定参数类型
String getVersionName(countryCode,province){
"中国"+"广东" //最后一行代码执行结果就是本函数的返回值
//也可以使用return
}
int getVersionCode(){
return 1000
}
2.1.5 无类型函数定义,使用def关键字
def doSomeThing(){
...
//最后一行可以返回,相当于Object
}
2.1.6 字符串操作
//单引号''保持java中String的原意,不转义
def singleQueteStr='I have $a apple' //输出就是I have $a apple
//双引号""类似于kotlin中对字符串的处理
def doubleQueteStr="I have an apple" //输出就是I have an apple
//双引号夹带变量
def a = 1
def str="I hava $a apple" //输出是I have 1 apple
//三引号如:'''aaaa'''中字符串支持随意换行
def mutilines = '''I have one apple,
I have two apple,
I have three apple。
'''
2.1.7 函数调用
groovy中除了代码中不需要加分号外,函数调用还可以不加括号,比如:
println("test")
println "test"
不过这样子使用,有时候groovy会把属性和函数调用混淆。
(这里需要一张测试图片)
2.2 数据类型
Groovy是java 的扩展,java的基本数据类型在Groovy中都有,但是Grooovy也拥有属于自己的数据类型,总得说Groovy的数据类型可以分为三种
- JAVA基本数据类型
- Groovy容器类
- 闭包
在这里主要为大家介绍与java不一样的两种
2.2.1 容器类
Groovy 中的容器就三种,List,Map,Range
- List :链表
- Map :键值
- Range :范围,List的一种扩展
2.2.1.1 List 链表
//定义一个List,它的元素可以是任何对象
def list = [1,"str",true]
//变量存取,可以直接通过索引存取,不用担心索引越界。
//如果索引超过链表长度,Groovy会自动向该链表添加元素
list[100]=100 // 当前链表的长度是101
2.2.1.2 Map 键-值
//定义一个Map,跟java不同的是,map的键必须是字符串,值可以是任何类型
def map=['key1':'value1','key2':1]
//另外key可以也可以不被 '',"" 包起来,Groovy默认会把Key处理成字符串
//例如
def map=[key1:1,key2:"string"]
//当然,如果不把key包起来,可能会导致混淆
//例如
def key1="aaa"
def map2=[key1:"str"] //这样就不知道key1到底是 "aaa" ,还是 "key1" 了
//在groovy中取值也更加方便了
map.keyname
map['keyName']
map.another = "mapValue" //添加元素
2.2.1.3 Range 类
//定义一个Range
def mRange = 1..25 //1-25的范围
//或者
def bRange = 1..<25 //1-24的范围
bRange.containsWithinBounds(2) == true //这样判断一个数字是否在bRange的范围内
bRange.form //最低值
bRange.to //最高值
2.2.2 闭包
闭包(Closure),是Groovy中非常重要的一个数据类型或者说一种概念。它代表了一段可执行代码。
2.2.2.1 认识闭包
def mClosure= {
String param1, int param2 -> //这个箭头很关键。箭头前面是参数定义,箭头后面是代码
println "this is code" //这是代码,最后一句是返回值,
//也可以使用return,和Groovy中普通函数一样
}
2.2.2.1.1 闭包的定义格式
def xxx = {无参数,纯code} //这种情况不需要->符号
def ccc = {参数->代码逻辑}
2.2.2.1.2 调用格式
闭包对象.call(参数)
闭包对象(参数)
xxx.call("aaa",1111)
xxx("aaa",1111)
特别需要注意的一点,如果闭包没定义参数的话,则隐含有一个参数,这个参数名字叫 it ,和this的作用类似。 it 代表闭包的参数。
//比如:
def greeting = { "Hello, $it!" }
assert greeting('Patrick') == 'Hello, Patrick!'
//等同于:
def greeting = { it -> "Hello, $it!"}
assert greeting('Patrick') == 'Hello, Patrick!'
//但是,如果在闭包定义时,采用下面这种写法,则表示闭包没有参数!
def noParamClosure = { -> true }
//这个时候,我们就不能给noParamClosure传参数了!
noParamClosure ("test") //会报错喔!
2.2.2.1.3 闭包使用时省略圆括号
public static <T> List<T>each(List<T> self, Closure closure)
//上面这个函数表示针对List的每一个元素都会调用closure做一些处理。这里的closure,就有点回调函数的感觉。但是,在使用这个each函数的时候,我们传递一个怎样的Closure进去呢?比如:
def iamList = [1,2,3,4,5] //定义一个List
iamList.each{ //调用它的each,这段代码的格式看不懂了吧?each是个函数,圆括号去哪了?
println it
}
//each函数调用的圆括号不见了!原来,Groovy中,当函数的最后一个参数是闭包的话,可以省略圆括号。比如
def testClosure(int a1,String b1, Closure closure){
//dosomething
closure() //调用闭包
}
//那么调用的时候,就可以免括号!
testClosure (4, "test", {
println "i am in closure"
} )
==这种用法我是拒绝的 = =!,我不知道你们你怎么想的==
比如说像项目里面的build.gradle中,完全看不懂是什么意思啊,就会以为花括号里面的代码在调用release时立即会被调用一样。素不知它还会被处理
[图片上传失败...(image-ec9acc-1542263977880)]
还有一个就是,作为类似于回调这种东西,该怎么知道调用者传递什么参数给Closure呢?
回答:查 API 文档
总结:Groovy的坑还有很多,闭包(Closure)的坑更多,不过这个并不影响我们现在对Gradle的学习
网友评论