介绍
Gradle 是android studio带的一款构建工具,方便、实用,一大堆的好话就不说了。
如果要熟练使用gradle的话 就要会使用Groovy脚本语言,Groovy由于它基于Java,所以我们仅介绍Java之外的东西。了解Groovy语言是掌握Gradle的基础。
Groovy
简介
Groovy是一种动态语言,它和Java一样,也运行于Java虚拟机中,你也可以认为groovy是扩展了java语言,Groovy对自己的定义就是:*Groovy是在 java平台上的、 具有像Python, Ruby 和 Smalltalk 语言特性的灵活动态语言, Groovy保证了这些特性像 Java语法一样被 Java开发者使用。执行Groovy脚本时,Groovy会先将其编译成Java类字节码,然后通过Jvm来执行这个Java类。
Groovy 基本语法知识
学习过swift的应该对下面的语法知识会会觉得很相识,所谓天下的语言都是一家,一脉相传,然后各自发挥。所以还是写一下加深印象。
- Groovy的注释标记和java一样,用 //或者/**/ 来表示;
- Groovy 的语句可以不用分号来结尾;
- Groovy 支持动态类型,也就是你在定义变量的时候可以不用指定他的数据类型,可以用关键字def,虽然def 不是必须的,但是为了代码清晰建议是加上这个关键字
def var = 1 //可以不用分号, 也可以不用指定类型
def var = "hello"
def int x = 10 //当然你也可以直接指定类型
- 函数定义的时候,可以不指定函数的参数类型;
String testFunction(arg1,arg2){//无需指定参数类型
...
}
- 函数的返回值也可以是无类型的,但需要使用def 关键字,最后会根据最后一行的代码的执行值 作为函数的返回类型;
//无类型的函数定义,必须使用def关键字
def nonReturnTypeFunc(){
last_line //最后一行代码的执行结果就是本函数的返回值
}
//如果指定了函数返回类型,则可不必加def关键字来定义函数
String getString(){
return"I am a string"
}
- 单引号' ',,对应java中的字符串,不会转义字符串中的内容,比如:
//不对$符号进行转义
defsingleQuote='I am $ dolloar' //输出就是I am $ dolloar
- 双引号:双引号就会执行转义,当字符串中出现$时会先去$表达式再求值
defdoubleQuoteWithoutDollar = "I am one dollar" //输出 I am one dollar
def x = 1
defdoubleQuoteWithDollar = "I am $x dolloar" //输出I am 1 dolloar
- 三个引号:三个引号的字符串支持随意换行,
- 除了每行代码不用加分号外,Groovy中函数调用的时候还可以不加括号
println("test") ---> println"test"
Groovy的数据类型
- 一个是Java中的基本数据类型。
- 另外一个是Groovy中的容器类。
- 最后一个非常重要的是闭包。
基本数据类型
作为动态语言,Groovy世界中的所有事物都是对象。所以,int,boolean这些Java中的基本数据类型,在Groovy代码中其实对应的是它们的包装数据类型。比如int对应为Integer,boolean对应为Boolean.
容器
Groovy容器支持3种分别是Map、List、Range.
- List :变量定义:
List变量由[]定义,比如 def aList = [5,'string',true] //List由[]定义,其元素可以是任何对象
变量存取:可以直接通过索引存取,而且不用担心索引越界。如果索引超过当前链表长度,List会自动 往该索引添加元素
assert aList[1] == 'string'
assert aList[5] == null //第6个元素为空
aList[100] = 100 //设置第101个元素的值为10
那么去到的 aList[100] 就是等于 100 ,
aList到现在为止有多少个元素呢?
println aList.size ===>结果是101
- Map: 我们知道map都是以键值对的形式出现的,key:value,下面看看在groovy中怎样的,
变量定义:Map变量由[:]定义,比如 def aMap = ['key1':'value1','key2':true] //单引号表示字符 还记得吧。
Map由[:]定义,注意其中的冒号。冒号左边是key,右边是Value。key必须是字符串,value可以是任何对象。另外,key可以用''或""包起来,也可以不用引号包起来。比如
def aNewMap = [key1:"value",key2:true]//其中的key1和key2默认被
处理成字符串"key1"和"key2"
但是如果你的key的值 是在你定义map之前就要用()包括起来, 比如下面
def key1="wowo"
def aConfusedMap=[key1:"who am i?"] //这个时候 就会出现 aConfusedMap的key值是 key1 而不是wowo,所以这个时候的正确写法应该是:
def aConfusedMap=[(key1):"who am i?"]
- Range :Range是Groovy对List的一种拓展,变量的定义的大体的使用如下:
def aRange = 1..5 //Range类型的变量 由begin值+两个点+end值表示
左边这个aRange包含1,2,3,4,5这5个值
如果不想包含最后一个元素,则
def aRangeWithoutEnd = 1..<5 //包含1,2,3,4这4个元素
println aRange.from //从哪个数开始
println aRange.to //从哪个数结束
- 闭包 :(这不是OC上面我们就用过的block嘛,只是在java当中我们没有用过而已),
闭包英文Closure,是Groovy中非常重要的一个数据类型或者说一种概念了。闭包的历史来源,种种好处我就不说了。我们直接看怎么使用它!
闭包,是一种数据类型,它代表了一段可执行的代码。其外形如下:
Stringparam1, int param2 -> //这个箭头很关键。箭头前面是参数定义,箭头后面是代码
println"this is code" //这是代码,最后一句是返回值,
//也可以使用return,和Groovy中普通函数一样
}
Closure的定义格式是:
def xxx = {paramters -> code} 或
def xxx = {无参数,纯code} 这种方式不需要->符号
调用闭包的方法:
- aClosure.call("this is string",100)
或 - aClosure("this is string", 100)
上面是闭包的定义和使用,同时需要注意的一点是,如果闭包没有定义参数的话,它默认是隐藏了一个参数名字为it ,就像this的作用类似,it 代表闭包的参数。看例子,
def greeting = { "Hello, $it!" }
greeting('Patrick') 执行结果是 'Hello, Patrick!'
上面的写法等同于
def greeting = { it -> "Hello, $it!" }
但是,如果在闭包定义时,采用下面这种写法,则表示闭包没有参数!
def noParamClosure = { -> true }
这个时候,我们就不能给noParamClosure传参数了!
noParamClosure ("test") <==会报错的!
闭包使用过程中的注意点
- 省略圆括号,当函数的最后一个参数是闭包的话,可以省略圆括号
def testClosure(int a1,String b1, Closure closure){
//dosomething
closure() //调用闭包
}
那么调用的时候,就可以免括号!
testClosure (4, "test", {
println"i am in closure"
} )
在Gradle中经常会出现这样的代码
task hello {
doLast{
printIn 'hello world'
}
}```
基本上面介绍的是一些基础的简单知识,很多内容还需要在后面学习和使用中总结。
网友评论