1. 程式人生 > >精簡依賴compile的行數及groovy迭代語法

精簡依賴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配置好像用處就不是很大了,所以在這就不做介紹了。