一、配置 Groovy 環境:
- 下載 Groovy(Groovy 依賴 Java,所以需要 JDK 環境):http://www.groovy-lang.org/download.html
- 配置環境變量:path 中添加 groovy 的 bin 目錄
在 cmd 中,運行 groovy -v,如果打印 groovy 版本信息,則說明配置正確。此外 groovy 自帶了編輯器(方便運行一些 snippets,當然最后可以另存為 .groovy,然后可以通過 groovy xxx.groovy 運行),可通過命令啟動。如下:
在 IntelliJ IDEA 中創建 groovy 工程:
IDEA 自帶對 groovy 的支持,可以直接選擇 Groovy 類型的工程,如下:
新建工程后,在 src 目錄下編輯 Groovy 腳本:
二、基礎語法:
1、語言簡介:
- 是一種基於 Java 虛擬機的動態語言
- 基礎語法和 Java 類似
- 能夠調用已存在的 Java 類庫
- Groovy 可以作為腳本語言來運行,也可以被編譯為 Java 的字節碼
- 如果僅僅在 Gradle 中使用 Groovy,只需要了解一些基本的 Groovy 知識
- 在 Groovy 中可以混寫 Java 代碼和 Groovy 知識。並且,如果不了解 Groovy 語法,完全可以只寫 Java 代碼
2、與 Java 的區別:
- 表達式后面的分號可省略(一般是省略)
- 缺省情況下,構造函數和方法都是 public 的(Java 默認是 package)
- 方法中的 return 語句可選,最后一個表達式的值作為返回值
- 編譯器自動為屬性添加 getter 和 setter 方法。並且可以直接使用屬性名來訪問屬性,但底層還是調用 getter 和 setter(當然 getter 和 setter 可顯式聲明,自定義)
- 當調用 == 來比較兩個對象,底層會自動調用 equals 方法
- Groovy 非空為真,而 Java 未采用
3、斷言:assert 可用作前置或后置條件的檢查,當檢查條件不符合時,程序終止運行,並提示錯誤。Groovy 的斷言和 Java 類似,並且運行時不需要指定 -ea 參數。
4、變量類型:
- Groovy 不強制要求申明變量類型,即可以使用 def 關鍵字定義變量(弱類型)。也可以作為強類型語言使用
- 注意:類比於 JavaScript 中的 var,但不同的是 Groovy 不指定變量類型,在賦值之前,變量為 Object 類型。好像現在 Java10 也支持 var 了
- 未賦值之前,變量值為 null
- 當為變量賦值之時,變量的類型才確定(使用 var,則為弱類型語言,類型可改變)
- 方法的參數、返回值類型同理
5、運算符:三目運算符 & Elvis 運算符:
//最開始 def name = 'a' def test = name != null ? name : 'b' //Groovy 支持非空為真 name = 'a' test = name ? name : 'b' //為了“不重復”,才有了 Elvis 運算符 name = 'a' test = name ?: 'b'
6、參數列表括號:當函數有參數時,可以省略括號。如:func(val1, val2),等價於 func val1, val2。
7、字符串:
單引號字符串:和 Java 的 String 等效
雙引號字符串:是一種新的字符串類型,稱為 GString:可以在字符串中使用 $ 符號引用變量;可以使用 ${} 計算表達式的值。這帶來了很多便捷
三引號字符串:可以保持格式,比如跨多行
8、List 集合:
- 默認使用 Java 的 ArrayList
- 使用方括號 [] 表示 List,值用逗號分隔
- 使用 << 運算符向最后添加一個元素
- 卻可以使用數組化方式訪問元素
- 使用 each 方法, lambda 作為參數,來遍歷元素(好像不是 lambda,而是閉包)
- 其余方法和 Java 是類似的
9、Map 集合:
- 默認使用 Java 的 LinkedHashMap
- 使用方括號表示 Map,值用逗號分隔。與 List 的區別在於:值為鍵值對,如 ['name1': 'value1', 'name2': 'value2']
- 通過為 new Key 賦值,添加新的元素,如 map[newKey] = value
- 可以使用點號訪問鍵值對,如 map.key,可以使用數組下標方式訪問 key
- 使用 each 方法遍歷元素,元素為鍵和值
例程(個人覺得,因為 Groovy 是腳本語言吧,所以可以不在類中,而是直接運行一些 "語法糖" ):
10、接下來就是比較帥氣、也相對重要的部分了——閉包 Closure:
- Groovy 中的閉包是一塊代碼(類似於 lambda 表達式。個人感覺就是把 lambda 包起來了)
- 可以賦值給變量、作為參數傳遞、像普通的方法被調用
- 閉包的類型是 groovy.lang.Closure
- 無參的閉包默認包含一個叫 it 的參數(隱式參數):閉包本身沒有參數,但是調用時,it 代表傳進來的第一個參數;如果調用時沒有提供參數,那么 it 的值為 null
- 閉包總有一個返回值:如果沒有顯示使用 return 語句,而且最后一個表達式沒有值,那么返回 null
例如:
def closure = { key, value -> println value }
委托:簡言之,就是被委托者,可以使用管理委托者吧。不過暫時用不着,以后再更新。
好嘛,我就是還沒搞懂。在老師的例程中,完全沒看出委托的作用,不過師傅領進門足矣。由於見識淺薄,對委托也無法熟練應用,等需要了、學會了,再記錄。可能學過設計模式就能懂了吧(劍23,嘿嘿)。