精简依赖compile的行数及groovy迭代语法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shangming150/article/details/79031920

今天在看这篇【Gradle模块化代码精炼:让你的gradle代码控制在100行以内】 文章时,发现之前一直想要做的事情——精简compile的行数。

具体的做法在文中都有说明,在这里我只是对这个方法的原理的一种说明:

首先描述一下精简的过程。

配置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配置好像用处就不是很大了,所以在这就不做介绍了。

猜你喜欢

转载自blog.csdn.net/shangming150/article/details/79031920