一 作用
編譯,打包砸王,依賴管理。
二 語言:Groovy
1 聲明變量和方法
def a = 1;
def b = "hello";
def int c = 3;
def sayHello(){
println("hello");
return 1;
}
1 變量類型名峦阁,方法類型名,分號耘成,return都可以省略榔昔。
所以可以變成:
def a = 1
def b = "hello"
def c = 3
def sayHello(){
println("hello")
1
}
2 def和類型存在一個就可以,也可以都存在
//case1:
def a = 1
int a = 1
def int a = 1
//case2:
def sayHello(String msg){
println(msg)
1
}
def sayHello(msg){
println(msg)
1
}
int sayHello(msg){
println(msg)
1
}
3 但是groovy依然是強類型語言瘪菌,類型轉(zhuǎn)換不一致時仍然會報錯撒会。
4 groovy中的注釋和java中的注釋一致。
2 Groovy數(shù)據(jù)類型
groovy中數(shù)據(jù)類型有:
1 java中的基本類型
2 java中的對象
3 閉包
4 加強的List师妙,Map等集合類型
5 加強的File诵肛,Stream等IO類型
變量默認(rèn)修飾符為public,基本類型和對象和java中一樣默穴,下面是有一些變換的類型怔檩。
1 String類型
String類型的特點是它的字符串拼接方式,用${}蓄诽,把變量放入{}中薛训,加到其他字符串中間,就可以仑氛。
def a = "a"
def b = "b"
def c = "a:${a},b:$乙埃"
println(c)
result:
a:a,b:b
2 閉包
閉包作為Groovy中的一個類型闸英,可以簡單理解成函數(shù)的另一種定義形式。
閉包可以指定參數(shù)和返回值介袜,當(dāng)然也可以不指定甫何。
//指定參數(shù)和返回值
def test1 = {
String a,int b->"result is a=${a},b=$"
}
def test2 = {
a,b->"result is a=${a},b=$遇伞"
}
//只指定返回值def test3 = { "result is no input"}
//只指定參數(shù)def test4 = { a,b-> println(a+b)}
//既不指定參數(shù)沛豌,又不指定返回值def test5 = { a = 2 b = 3 c = a+b println(c)}
//運行
def a = test1("test1",1)
println(a)
def b = test2("test2",2)
println(b)
def c = test2()
println(c)
test4(1,2)
test5()
//最后的輸出分別為
result is a=test1,b=1
result is a=test2,b=2
result is no input
3
5
當(dāng)閉包中不指定參數(shù)時,閉包中默認(rèn)存在一個it參數(shù)赃额,可以直接使用加派,也可以當(dāng)做它不存在,不使用跳芳。
使用的例子:
def hiddenTest = {
println("the hidden parameter is ${it}")
}
//運行
hiddenTest("test")
//結(jié)果
the hidden parameter is test
3 List 和Map
關(guān)于Map和List芍锦,Groovy中添加了一些簡單的寫法,一些方法名上也做了一些改動飞盆。
可以直接在文檔中查閱娄琉,文檔不支持搜索,只能按照首字母索引的順序找吓歇。
http://docs.groovy-lang.org/latest/html/groovy-jdk/index-all.html
4 File孽水,Stream,XmlParser
groovy中同樣提供了文件流的操作城看,和xml解析工具女气。也是做了一些簡化,同時增加了java中不存在的一些方法测柠。
文檔
http://docs.groovy-lang.org/latest/html/groovy-jdk/index-all.html
3 Groovy中其他特性
1 對于class類型的數(shù)據(jù)炼鞠,可以省略 .class,下面兩種寫法效果完全一致
func(File.class)
func(File)
def func(Class clazz) {}
2 類中自動包含getter和setter轰胁,下面兩種寫法效果也是一致的
Book bk = new Book()
bk.id = 1
bk.name = "android art"
bk.press = "china press"
//可以簡寫為:
Book bk = new Book()
bk.with {
id = 1
name = "android art"
press = "china press"
}
4 簡化的三元表達(dá)式
def result = name != null ? name : "Unknown"
// 省略了name
def result = name ?: "Unknown"
5 簡化的非空判斷
if (order != null) {
if (order.getCustomer() != null) {
if (order.getCustomer().getAddress() != null) {
System.out.println(order.getCustomer().getAddress());
}
}
}
//可以簡寫為:
println order?.customer?.address
6 在Groovy中谒主,可以使用assert來設(shè)置斷言,當(dāng)斷言的條件為false時赃阀,程序?qū)伋霎惓?/h4>
def check(String name) {
// name non-null and non-empty according to Gro ovy Truth
assert name // safe navigation + Groovy Truth to check
assert name?.size() > 3
}
7 switch中判斷條件更靈活霎肯,可支持多種類型同時判斷
def x = 1.23
def result = ""
switch (x) {
case "foo":
result = "found foo" // lets fall through
case "bar":
result += "bar"
case [4, 5, 6, 'inList']:
result = "list"
break
case 12..30:
result = "range"
break
case Integer:
result = "integer"
break
case Number:
result = "number"
break
case { it > 3 }:
result = "number > 3"
break
default:
result = "default"
}
8 在Groovy中,==相當(dāng)于Java的equals榛斯,观游,如果需要比較對個對象是否是同一個,需要使用.is()肖抱。
Object a = new Object()
Object b = a.clone()
assert a == b
assert !a.is(b)
4 編譯备典,運行Groovy
def check(String name) {
// name non-null and non-empty according to Gro ovy Truth
assert name // safe navigation + Groovy Truth to check
assert name?.size() > 3
}
def x = 1.23
def result = ""
switch (x) {
case "foo":
result = "found foo" // lets fall through
case "bar":
result += "bar"
case [4, 5, 6, 'inList']:
result = "list"
break
case 12..30:
result = "range"
break
case Integer:
result = "integer"
break
case Number:
result = "number"
break
case { it > 3 }:
result = "number > 3"
break
default:
result = "default"
}
Object a = new Object()
Object b = a.clone()
assert a == b
assert !a.is(b)
只需要在build.gradle中編寫task,然后用gradle命令意述,執(zhí)行這個task就可以
task(testname).doLast {
println "test"
aFun()
}
def aFun() {
println "have fun!"
System.out.println("test!");
}
運行
gradle testname
三 Gradle
1 gradle的編譯周期
提到gradle的編譯提佣,兩個重要的概念是Project和Task
Project:對應(yīng)build.gradle文件吮蛹,每個build.gradle就是一個Project
Task:就是build.gradle中具體的task,就是一個個方法拌屏,每個Task中又有多個action
執(zhí)行的過程潮针,就是依次執(zhí)行各個action,action之間會有依賴關(guān)系倚喂,gradle會按照依賴關(guān)系順序執(zhí)行每篷。
gradle的編譯分為三個過程:
初始化階段:創(chuàng)建Project,有多個build.gradle就會創(chuàng)建多個Project
配置階段:執(zhí)行所有的配置文件端圈,同時創(chuàng)建出所有Project中的所有Task
執(zhí)行階段:依次執(zhí)行各個Task焦读,也就是依次執(zhí)行所有Task中的action
2 Gradle Files
下圖是gradle中一個最基本的配置
<input type="file" accept=".jpg, .jpeg, .png, .gif" style="display: none;">
settings.gradle: 哪些模塊會被編譯
頂層的build.gradle:對所有的module生效
每個module中的build.gradle:只對自己的module生效,如果和頂層build.gradle內(nèi)容沖突舱权,會覆蓋頂層的build.gradle
頂層的build.gradle
<input type="file" accept=".jpg, .jpeg, .png, .gif" style="display: none;">
buildscript
指定了Android 編譯所需要的依賴包
repositories中指定代碼的Maven倉庫dependencies中指定具體的依賴
allprojects
這里面的配置將會應(yīng)用到所有的module矗晃,只放所有module中一些公共的東西。
每個module中的build.gradle
apply plugin
這里制定了Android中用的的gradle插件宴倍,這個插件中提供很多Android中需要的Task方法
android
是插件中提供的一個Task张症,這里大塊里指定了所有Android有關(guān)的基本配置
defaultConfig:默認(rèn)配置,如果在AndroidManefest.xml定義了同樣的字段鸵贬,這里的會覆蓋xml中的
buildTypes:編譯類型俗他,release和debug,不同的編譯類型對應(yīng)不同的編譯命令
dependencies
定義該module中的所有依賴