Gradle入門之Groovy語法
前言
gradle是一個基於JVM的構建工具,它結合了Python、Ruby和Smalltalk的許多強大的特性,Groovy 程式碼能夠與Java程式碼很好地結合,也能用於擴充套件現有程式碼。由於其執行在 JVM 上的特性,Groovy可以使用其他Java語言編寫的庫。目前已經應用在多數Android技術體系中,比如,jenkins,外掛化,元件化,模組化等等。如果你不瞭解gradle,那麼前面幾個技術點很難深入理解。
Groovy 的語法跟 kotlin 類似,如果我們有 kotlin 的經驗的話那麼學習 groovy 會容易很多。下面我們一起來學習下groovy的核心語法,大家可以跟著樣例敲一下加深理解、記憶。
基本特點
- 構建在強大的Java語言之上 並 添加了從Python,Ruby和Smalltalk等語言中學到的 諸多特徵,例如動態型別轉換、閉包和超程式設計(metaprogramming)支援。
- 為Java開發者提供了 現代最流行的程式語言特性,而且學習成本很低(幾乎為零)。
- 支援DSL(Domain Specific Languages領域定義語言)和其它簡潔的語法,讓程式碼變得易於閱讀和維護。
- 受檢查型別異常(Checked Exception)也可以不用捕獲。
- Groovy擁有處理原生型別,面向物件以及一個Ant DSL,使得建立Shell Scripts變得非常簡單。
- 在開發Web,GUI,資料庫或控制檯程式時 通過 減少框架性程式碼 大大提高了開發者的效率。
- 支援單元測試和模擬(物件),可以 簡化測試。
- 無縫整合 所有已經存在的 Java物件和類庫。
- 直接編譯成Java位元組碼,這樣可以在任何使用Java的地方 使用Groovy。
- 支援函數語言程式設計,不需要main函式。
- 一些新的運算子。
- 預設匯入常用的包。
- 斷言不支援jvm的-ea引數進行開關。
- 支援對物件進行布林求值。
- 類不支援default作用域,且預設作用域為public。
- groovy中基本型別也是物件,可以直接呼叫物件的方法。
基礎語法
Groovy中的變數
groovy中變數既可以像java一樣是強型別的,也可以像kotlin一樣是弱型別的。
程式碼示例如下:
class Study { static void main(String[] args) { String a = 'Hello World' def b = "Hello Silence" println(a) println(b) } }
輸出結果如下:
Hello World
Hello Silence
Groovy中的運算子和條件控制
與java一致,這裡不過多介紹
Groovy中的字串
Groovy提供了多種表示String字面量的方法。Groovy中的字串可以用單引號(’),雙引號(“)或三引號(“““)括起來。此外,由三重引號括起來的Groovy字串可以跨越多行。
示例程式碼如下:
class Study {
static void main(String[] args) {
String a = 'Hello World'
def b = "Hello Silence"
def c = '''Hello World
Hello Silence'''
println(a)
println(b)
println(c)
}
}
執行結果如下:
Hello World
Hello Silence
Hello World
Hello Silence
字串的擴充套件
Groovy的擴充套件和kotlin的一樣,示例程式碼如下:
class Study {
static void main(String[] args) {
String a = 'Hello World'
def b = "Hello $a"
println(a)
println(b)
}
}
輸出結果如下:
Hello World
Hello Hello World
字串的索引
Groovy中的字串是字元的有序序列。字串中的單個字元可以通過其位置訪問。這由索引位置給出。
字串索引從零開始,以小於字串長度的一個結束。Groovy還允許負索引從字串的末尾開始計數。
具體示例程式碼如下:
class Study {
static void main(String[] args) {
String a = 'Hello World'
println(a[1])//輸出座標為1的內容
println(a[-2])//輸出座標為倒數第二的內容
println(a[1..2])//輸出座標區間為1-2的內容
println(a[2..5])//輸出座標區間為2-5的內容
}
}
輸出結果如下:
e
l
el
llo
資料結構
Range範圍
範圍是指定值序列的速記。範圍由序列中的第一個和最後一個值表示,Range可以是包含或排除。包含範圍包括從第一個到最後一個的所有值,而獨佔範圍包括除最後一個之外的所有值。
- 1…10 — 包含範圍的示例
- 1 … <10 - 獨佔範圍的示例
- ‘a’…‘x’ - 範圍也可以由字元組成
- 10…1 - 範圍也可以按降序排列
- ‘x’…‘a’ - 範圍也可以由字元組成並按降序排列。
方法 | 描述 |
---|---|
contains() | 檢查範圍是否包含特定值 |
get() | 返回此範圍中指定位置處的元素。 |
getFrom() | 獲得此範圍的下限值。 |
getTo() | 獲得此範圍的上限值。 |
isReverse() | 這是一個反向的範圍,反向迭代 |
size() | 獲得範圍的元素值。 |
subList() | 返回此指定的fromIndex(包括)和toIndex(排除)之間的此範圍部分的檢視。 |
List
列表是用於儲存資料項集合的結構。在 Groovy中,List儲存了一系列物件引用。
List中的物件引用佔據序列中的位置,並通過整數索引來區分。
groovy 中的一個列表中的資料可以是任意型別。這和java下集合列表有些不同,java下的列表是同種型別的資料集合。
groovy中列表還可以巢狀列表。如[1,2,[3,4,5],“aaa”]groovy列表內建有反轉方法 reverse()。呼叫 List.reverse() 可以實現列表反轉。groovy列表內建有排序方法 sort()。呼叫 List.sort() 可以實現列表排序。空列表表示為[]宣告一個空集合。
Map
Map是物件引用的無序集合。Map集合中的元素由鍵值訪問。Map中使用的鍵可以是任何類。當我們插入到Map集合中時,需要兩個值:鍵和值。
面向物件
三大特性
Groovy中的面向物件和其他任何的面嚮物件語言一樣,存在類和物件的概念。不過在groovy新增了一個trait的關鍵字,名為特徵。
Groovy中的特徵
特徵是語言結構的構造,其他包括:
- 行為的組成
- 介面執行時的實現
- 與靜態型別檢查/編譯的相容性
使用trait關鍵字定義特徵。示例程式碼如下:
class Study {
static void main(String[] args) {
Student st = new Student();
st.StudentID = 1
st.Marks1 = 10
st.DisplayMarks()
}
}
trait Marks {
void DisplayMarks() {
println("Display Marks")
}
}
class Student implements Marks {
int StudentID
int Marks1
}
輸出結果如下:
Display Marks
上述示例中trait是類似介面的存在,同理,trait也可以實現介面。
示例程式碼如下:
class Study {
static void main(String[] args) {
Student st = new Student();
st.StudentID = 1
st.Marks1 = 10
st.DisplayMarks()
st.DisplayTotal()
}
}
interface Total {
void DisplayTotal()
}
trait Marks implements Total {
void DisplayMarks() {
println("Display Marks")
}
void DisplayTotal() {
println("Display Total")
}
}
class Student implements Marks {
int StudentID
int Marks1
}
輸出結果如下:
Display Marks
Display Total
擴充套件特徵
特徵的擴充套件則使用extends關鍵字,示例程式碼如下:
trait Marks {
void DisplayMarks() {
println("Marks1");
}
}
trait Total extends Marks {
void DisplayMarks() {
println("Total");
}
}
Groovy中的閉包
閉包是一個短的匿名程式碼塊,個人理解是和lamda是差不多的。
下面是一個簡單的閉包例子,程式碼如下:
class Study {
static void main(String[] args) {
def test = { println "Hello World" }
test.call()
}
}
輸出結果如下:
Hello World
閉包中的形式引數
閉包也可以包含形式引數,以使它們更有用,就像Groovy中的方法一樣。
class Study {
static void main(String[] args) {
def hello="Hello"
def test = {params -> println "$hello World" }
test.call()
}
}
輸出結果也是Hello World。
當然我們還有另外一種寫法:
class Study {
static void main(String[] args) {
def test = { println "Hello ${it}" }
test.call("World")
}
}
我們還可以把上面兩種的形式,進行組合,示例程式碼如下:
class Study {
static void main(String[] args) {
def hello="Hello"
def test = { params ->println "$hello ${params}" }
test.call("World")
}
}
在方法中使用閉包
類似kotlin的方法中可以傳匿名函式一樣。示例程式碼如下:
class Study {
static void main(String[] args) {
def hello="Hello"
def test = { params ->println "$hello ${params}" }
Study.Display(test)
}
def static Display(clo) {
clo.call("Silence")
}
}
輸出結果如下:
Hello Silence
Groovy中的Json
我們先來看看 groovy 中物件與 json 字串之間的相互轉換:
import groovy.json.JsonOutput
class Study{
public static void main(String[] args) {
def study = [new Person("silence", 25),
new Person("david", 26)]
def json=JsonOutput.toJson(study)
println json
//帶格式的輸出json
println JsonOutput.prettyPrint(json)
}
}
class Person {
private String name
private int age
Person(String name, int age) {
this.name = name
this.age = age
}
String getName() {
return name
}
void setName(String name) {
this.name = name
}
int getAge() {
return age
}
void setAge(int age) {
this.age = age
}
}
輸出結果如下:
[{"age":25,"name":"silence"},{"age":26,"name":"david"}]
[
{
"age": 25,
"name": "silence"
},
{
"age": 26,
"name": "david"
}
]
總結
本篇主要講解了groovy的基本語法,整體上是和kotlin和java的語法是差不多的。相對而言,熟悉kotlin和java的,上手groovy會很快。
參考
暴力突破 Gradle 自動化專案構建(二)- Groovy 核心語法
Groovy教程
本文首發於我的個人部落格:Gradle入門之Groovy語法
更多文章請關注我的公眾號:碼農職場