精簡依賴compile的行數及groovy迭代語法
具體的做法在文中都有說明,在這裡我只是對這個方法的原理的一種說明:
首先描述一下精簡的過程。
配置config.gradle
相信很多小夥伴都已經使用過這種配置對gradle進行統一管理,而且在上面這篇文章中,度config.gradle的配置以及使用都已經講解的很詳細了。所以我直接貼上我的config.gradle配置程式碼。
ext {
android = [
compileSdkVersion: 25,
buildToolsVersion: '26.0.2',
minSdkVersion : 18 ,
targetSdkVersion : 25,
versionCode : 1,
versionName : "1.0.1"
]
dependencies = [
"support-design" : "com.android.support:design:25.1.0",
"greendao" : "org.greenrobot:greendao:3.2.2",
"rxandroid1" : "io.reactivex:rxandroid:1.2.1",
"okhttp3-logging" : "com.squareup.okhttp3:logging-interceptor:3.7.0",
"okhttp3-urlconnection": "com.squareup.okhttp3:okhttp-urlconnection:3.7.0",
"retrofit2-retrofit" : "com.squareup.retrofit2:retrofit:2.3.0",
"retrofit2-gson" : "com.squareup.retrofit2:converter-gson:2.3.0",
"retrofit2-scalars" : "com.squareup.retrofit2:converter-scalars:2.3.0",
"retrofit2-rxjava" : "com.squareup.retrofit2:adapter-rxjava:2.2.0",
"constraint-layout" : "com.android.support.constraint:constraint-layout:1.0.0-beta4",
"bugly" : "com.tencent.bugly:crashreport:2.6.5",
"SmartRefreshLayout" : "com.scwang.smartrefresh:SmartRefreshLayout:1.0.3",
"rxpermissions" : "com.tbruyelle.rxpermissions:rxpermissions:0.9.4@aar"
]
}
然後呢,是app module中gradle的dependicies程式碼(不再貼其他部分的程式碼,想了解的請看上文)。
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// config.gradle中的dependencies其實是一個HashMap,所以使用groovy語法中的map取鍵值對,迴圈compile即可
libraries.each { k, v -> compile v } // k-key,v-value
//XML解析
compile('com.squareup.retrofit2:converter-simplexml:2.2.0') {
exclude group: 'xpp3', module: 'xpp3'
exclude group: 'stax', module: 'stax-api'
exclude group: 'stax', module: 'stax'
}
}
上面的程式碼中,我增加了一些註釋,這就是本文的主要意圖。所以,接下來介紹一下groovy中關於迭代的一些內容。
Groovy 中的迭代
Groovy 列表迭代
def list = ["Java", "Groovy", "JavaScript"]
list.each{language->
println language
}
第一行是 Groovy 用於構建 java.util.ArrayList 的便捷語法。可以將 println list.class 新增到此指令碼來驗證這一點。
接下來,只需對列表呼叫 each(),並在閉包體內輸出 language 變數。在閉包的開始處使用 language-> 語句命名 language 變數。如果沒有提供變數名,Groovy 提供了一個預設名稱 it。
// shorter, using the default it variable
def list = ["Java", "Groovy", "JavaScript"]
list.each{ println it }
// shorter still, using an anonymous list
["Java", "Groovy", "JavaScript"].each{ println it }
Map 迭代
def map = ["Java":"server", "Groovy":"server", "JavaScript":"web"]
map.each{ println it }
上面使用預設的it引數,輸出該map的value值。
def map = ["Java":"server", "Groovy":"server", "JavaScript":"web"]
map.each{
println it.key
println it.value
}
map.each{k,v->
println k
println v
}
可以使用上面的方式,分別獲取map對應的鍵值對值。
注:這裡就是gradle中使用libraries.each { k, v -> compile v } // k-key,v-value的原理。
String迭代
groovy可以使用each對一個字串中的字元,進行逐一迭代輸出。
def name = "Jane Smith"
name.each{letter->
println letter
}
這種使用方法可以對字串中間的某一個字元進行替換,後續這種方式可以考慮融合到android gradle中。
def name = "Jane Smith"
println "replace spaces"
name.each{
if(it == " "){
print "_"
}else{
print it
}
}
// output
Jane_Smith
Range 迭代
Groovy 提供了原生的 Range 型別,可以直接迭代。使用兩個點分隔的所有內容(比如 1..10)都是一個 Range
def range = 5..10
range.each{
println it
}
//output:
5
6
7
8
9
10
其實Range不侷限與整形,其他型別也可以,如Date型別,但這些對android 的gradle配置好像用處就不是很大了,所以在這就不做介紹了。