Android Studio Grade Groovy語言入門篇

Gradle系列分2章
上篇Android Gradle Groovy自動化構建入門篇
下篇Android Gradle Groovy自動化構建進階篇html

Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化構建工具。它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置,拋棄了基於XML的各類繁瑣配置。java

爲何要學習它

咱們知道主流的的構建工具備Ant,Maven,那咱們爲何還要學習Gradle那?編程

  • Ant 只負責 編譯、測試、打包
  • Maven 新增依賴管理、發佈,採用xml管理,xml配置項目大的話,容易囉嗦和臃腫
  • Gradle 採用Groovy管理,具備更高的靈活性和可擴展性。 因此咱們頗有必要一塊來學習一下。

手動安裝Gradle

1.確保已安裝JDK,在終端運行api

$ java -version
	java version "1.8.0_121"	
複製代碼

2.從Gradle官網下載最新Gradle,而後解壓. 3.配置環境變量
* Linux和MacOS用戶 配置您的PATH環境變量以包含bin解壓縮分發的目錄: $ export PATH=$PATH:/opt/gradle/gradle-4.4.1/bin
* Windows用戶 點擊:個人電腦- 屬性-高級屬性 —環境變量, 選擇下 CLASSPATH,而後編輯。添加 C:\Gradle\gradle-4.4.1\bin,點擊保存。 * 驗證安裝 執行$ gradle -v 若是出現了相似一下界面,bash

------------------------------------------------------------
Gradle 4.4.1
------------------------------------------------------------ 
複製代碼

那麼恭喜你,你已安裝成功,接下來咱們就從Gradle的 基本語法開始,一塊兒來揭開Gradle的神祕面紗吧。閉包

Groovy基本語法理論介紹

前面咱們知道Gradle是一種基於Groovy語言(DSL)來聲明的,因此咱們頗有必要先了解下Groovy 語言。Groovy 語言是用於Java虛擬機的敏捷語言,是能夠用於面對對象編程,又能夠用做純粹的腳本語言,同時有具備閉包和動態語言的其餘特性。app

基本特性:

1. Groovy 徹底兼容java語法
2. 末尾的分號是可選的
3. 類、方法默認是public的
4. 編譯器會自動添加getter/setter方法
5. 屬性能夠用.號獲取
6. 最後一個表達式的值會做爲返回值的
7. ==等同於equals(),不會有NullPointerExceptions
複製代碼

高效特性

1. assert 斷言語句 能夠寫在任何地方
2. 可選類型定義,至關於若類型語言 ,類型會自動推導出來的
3. 可選的括號 ,方法如過有有參數,()能夠不寫
4. 字符串 有三種 分別爲 ''""''' '''
5. 閉包
複製代碼

Groovy 經常使用api

打開Ide工具新建工程,選擇new -- project —依次點擊 函數

D4FA8425-0201-4DC5-8045-5BF238E3ECF2.png
EEEB527E-6D12-40B8-AE4C-E9CDE8FF8A3E.png

基本特性:

Snip20180114_3.png

高效特性

Snip20180114_4.png
閉包是一種代碼塊,叫作Closure,這是一種相似於C語言中函數指針的東西。用起來很是方便,在Groovy中閉包能夠做爲方法的參數和返回值,也能夠做爲一個變量賦值存在。 如何聲明閉包?

{ parameters ->
   code
}
複製代碼

閉包能夠有返回值和參數,固然也能夠沒有。下面是幾個具體的例子工具

//有參閉包,賦值給一個變量
def c1 = {
    v ->
        println v
}
//無參閉包,賦值給一個變量c2
def c2 = {
    println 'hello'
}
//c2閉包做爲參數傳入方法method2中
method2(c2)
複製代碼

另外,若是閉包不指定參數,那麼它會有一個隱含的參數 it,閉包是一個難點 建議多看官方APIpost

def test = {
   println "隱含的參數 ${it}, I am a closure!"
}
test(100)
outputs:
find 100, I am a closure! 
複製代碼

經常使用集合api

  • list
def fruits = ['apple', 'orange']//聲明
fruits << 'banana'//添加數據
fruits[0] = "gradle"//集合中第一項從新賦值
println fruits[0]//根據key取出數據
println fruits.size
println fruits.getClass()

outputs:
gradle
3
class java.util.ArrayList
複製代碼

由此能夠看出Groovy中國list就是java中的ArrayList<<表示向List中添加新元素

  • map
def dataSource = ['groupId': 1, 'year': '2017']//聲明
dataSource.groupName = '行業'//添加數據
dataSource['year'] = '2018'//更新數據
println dataSource['year']//獲取value
println dataSource.groupId//獲取value
println dataSource.size()
println dataSource.getClass()

outputs:
2018
1
3
class java.util.LinkedHashMap
複製代碼

由此能夠看出Groovy中國map就是java中的LinkedHashMap,訪問key不只能夠經過map.獲取dataSource.groupName也經過map[key]獲取dataSource['year']獲取。 假如咱們如今想採用Groovy方式遍歷和這個集合該怎麼辦那?查文檔發現 [image:422EA4A3-C96F-40A7-9E74-3AD85AF88A43-4899-00001DBAD2F11AC4/Snip20180114_6.png] 能夠發現,這兩個each方法的參數都是一個閉包,若是咱們傳遞的閉包是一個參數,那麼它就把entry做爲參數;若是咱們傳遞的閉包是2個參數,那麼它就把key和value做爲參數。 接下來咱們遍歷上面的 dataSource

dataSource.each { key, value ->
    println "two parameters, find [${key} : ${value}]"
}
println()
dataSource.each {
    println "one parameters, find [${it.key} : ${it.value}]"
}

outputs:
two parameters, find [groupId : 1]
two parameters, find [year : 2018]
two parameters, find [groupName : 行業]

one parameters, find [groupId : 1]
one parameters, find [year : 2018]
one parameters, find [groupName : 行業]
複製代碼
  • 增強的IO 在Groovy中,文件訪問要比Java簡單的多,無論是普通文件仍是xml文件

讀取普通文件

在根目錄下,新建a.txt [image:88688DC4-000C-4FF4-8ABA-0234A13A2A84-4899-0000206B8BF3CA1E/C6E33E21-322F-4A1A-9AAA-835B7A00F0A5.png] 接下里咱們就把a.txt的文本按行取出來

def file = new File("a.txt")
file.eachLine {
    line,lineNo->
        println "${lineNo} ${line}"
}
file.eachLine { line ->
    println "${line}"
}

outputs:
1 hello
2 gradle
hello
gradle

複製代碼

除了eachLine外,File還提供了不少Java所沒有的方法,咱們須要用的時候再去查就好了。

接下來讓咱們在試下讀取xml文件

Groovy訪問xml有兩個類:XmlParser和XmlSlurper,兩者幾乎同樣,查看官方demo以下

def xml = '<root><one a1="uno!"/><two>Some text!</two></root>'
 def rootNode = new XmlParser().parseText(xml)
 assert rootNode.name() == 'root'
 assert rootNode.one[0].@a1 == 'uno!'
 assert rootNode.two.text() == 'Some text!'
 rootNode.children().each { assert it.name() in ['one','two'] }
複製代碼

好了,今天是咱們這個Gradle系列的第一篇文章,相信如今你已經瞭解了Gradle的基本語法了,固然也是一些最經常使用的用法。下一篇文章當中,咱們會介紹Gradle構建腳

若有疏漏,請指出,若有問題能夠經過以下方式聯繫我

簡書 csdn 掘金 klvens跑碼場

相關文章
相關標籤/搜索