1. 程式人生 > 其它 >Gradle入門之Groovy語法

Gradle入門之Groovy語法

技術標籤:Gradleandroid

前言

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語法

更多文章請關注我的公眾號:碼農職場
在這裡插入圖片描述