1. 程式人生 > >Gradle理論與實踐二:Groovy介紹

Gradle理論與實踐二:Groovy介紹

文章目錄

Groovy介紹

Groovy是基於JVM虛擬機器的一種動態語言,語法和Java非常相似,Groovy程式碼在執行時同樣編譯成Class位元組碼在JVM上執行,可以認為Groovy擴充套件了Java語言。除此之外,Groovy還支援閉包、支援DSL(Domain Specific Lauguage 領域特定語言),是一門非常靈活的指令碼語言。

Groovy、Java、JVM之間的關係:

groovy.png

Groovy的一些特點:

  • Groovy語句可以不用分號結尾;
  • Groovy使用def關鍵字定義變數(def不是必須的,但建議不要省略),定義變數的時候可以不指定其型別;同樣Groovy定義函式時,引數也可以不指定型別;
  • Groovy除了變數和函式中的引數可以不指定型別,函式中如果有返回值,可以省略return,函式中最後一句程式碼執行結果即是返回值。

1、字串處理

在Java中,雙引號代表一個字串,單引號代表是字元;在Groovy中,單引號和雙引號都可以定義一個字串常量,但是單引號和雙引號也是有區別的,如下:

vatask hello {
    def name = "beijing"
    doLast {
       print "雙引號:name is ${name}\n"
       print '雙引號:name is ${name}'
    }
}

結果:

bogon:test_gradle mq$ gradle -q hello
雙引號:name is beijing
雙引號:name is ${name}

從輸出結果可以得出結論:單引號是不具備運算能力的,所有表示式都被認為是字串;而雙引號可以通過${}表示式放入變數或者進行表示式計算。

2、集合的宣告與操作

List

對應Java中的List介面,其實現類是ArrayLIst.

  • 定義List:
def myList = [1, 2, 3, 4, 5]

myList的型別是java.util.ArrayList

  • List取值:
print numList[0]//訪問第一個元素 結果為1
print numList[1]//訪問第二個元素 結果為2
print numList[-1]//訪問倒數第一個元素 結果為5
print numList[1..3]//訪問第二個到第四個元素 結果為[2,3,4]

可見在Groovy中索引值不僅可以是正的,還可以是負的,表示從右往左數;還可以是一個範圍索引(如1…3);如果索引越界,返回Null。

  • 遍歷List
    使用List.each即可遍歷LIst,如:
task hello << {
     def numList = [1, 2, 3, 4, 5]

     numList.each {
        print it
      }
}

Map

  • 定義Map、Map取值、遍歷Map
  //定義Map 以K-V形式儲存 其中country、city為Key值,china、beijing為value
  def myMap = ['country': 'china', 'city': 'beijing']

  //下面兩種方式都可以獲取到key對應的value
  print myMap.country //結果為china
  print myMap['country'] //結果為china

  //map迭代也是用each方法,迭代的元素是一個Map.Entry
  myMap.each {
      print "Key:${it.key},value:${it.value}"
  }

3、方法

  • 方法的括號是可以省略的,如下:
static def mMethod(int a, int b) {
    return a + b
}

task hello << {
    //下面兩種方式結果是一樣的
    mMethod(2, 3)
    mMethod 2, 3
}

mMethod中的return也是可以省略的,當沒有return時,Groovy會把方法執行過程中的最後一句程式碼作為其返回值。

  • 程式碼塊(閉包closure)可以作為引數傳遞

**被{}包圍起來的程式碼被稱為程式碼塊。**Groovy允許一個程式碼塊可以作為引數傳遞到方法裡的,如下面三種方式:

task hello << {
     def myList = [1, 2, 3, 4, 5]
     
     //第一種:方法中傳入程式碼塊{}
     myList.each({ print it })

     //第二種:Groovy規定,如果方法最後一個引數是閉包,可以放到方法外面
     myList.each() { print it }

     //第三種:方法括號可以省略,就變成我們最常見的形式了
     myList.each {
         print it
     }
}

4、閉包

閉包(Closure)是一種資料型別,通俗來說就是一段可執行的程式碼塊。來自定義一個閉包:

//定義一個閉包
static def customClosure(closure) {
    def myMap = ['name': 'mq', 'country': 'china']
    myMap.each {
         //閉包中有兩個引數
        closure(it.key, it.value)
    }
}

task hello << {
    customClosure {
        //宣告多個引數 對應閉包中的key和value
        k, v ->
            print "${k} is ${v}\n"
    }
}

當閉包中有一個引數時,預設就是it;當有多個引數時,就不能用it了,需要宣告多個引數。如用 (k,v) 宣告閉包中的兩個引數, ->操作符用於把閉包的引數和主體區分開。