日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Gradle系列之Groovy基礎(chǔ)篇

 行者花雕 2020-03-01
原文首發(fā)于微信公眾號:躬行之(jzman-blog),歡迎關(guān)注交流!

上一篇學(xué)習(xí)了 Gradle 的入門知識,Gradle 基于 Groovy,今天學(xué)習(xí)一下 Groovy 的基礎(chǔ)知識,Groovy 是基于 JVM 虛擬機(jī)的一種動態(tài)語言,語法與 Java 語法類似,Groovy 完全兼容 Java,每個(gè) Gradle 文件都是一個(gè) Groovy 腳本文件,Gradle 文件基于 Groovy 語法,而 Groovy 又兼容 Java,故可以在 Gradle 文件中寫 Java 代碼,在此基礎(chǔ)上增加了很多新特性,如支持閉包、DSL等,可以說 Groovy 是一門非常靈活的動態(tài)腳本語言,閱讀本文之前可以先閱讀下面這篇文章:

  • Gradle系列之初識Gradle

下面針對 Gradle 來學(xué)習(xí)一下 Groovy 的一些基礎(chǔ)知識。

  1. 字符串

  2. 集合

  3. 方法

  4. JavaBean

  5. 關(guān)于閉包

字符串

說一個(gè) Groovy 的特性,在 Groovy 中分號不是必須的,其單引號是雙引號都定義的是一個(gè)字符串常量,不同之處是單引號是純粹的字符串常量,不會對該字符串里面的表達(dá)式做運(yùn)算,而使用雙引號定義的字符串常量可以使用合法表達(dá)式做相關(guān)運(yùn)算,測試代碼如下:

task stringTest{
    //使用def關(guān)鍵字定義變量,
    def str1 = "雙引號"
    def str2 = '單引號'
    
    println "雙引號定義的字符串:"+str1
    println "雙引號定義的字符串:"+str1.class
    println "單引號定義的字符串:"+str2
    
    //變量動態(tài)變化
    str1 = true;
    println "雙引號定義的字符串:"+str1.class
    
    //使用$運(yùn)算符
    println "雙引號定義的字符串:${str1}"
    //只有一個(gè)變量的時(shí)候可以省去中括號
    println "雙引號定義的字符串:$str1"
    
    //單引號定義的字符串不能使用表達(dá)式進(jìn)行運(yùn)算
    println '單引號定義的字符串:$str2'
}

下面是執(zhí)行結(jié)果,參考如下:

PS E:\Gradle\study\Groovy> gradle stringTest

> Configure project :
雙引號定義的字符串:雙引號
雙引號定義的字符串:class java.lang.String
單引號定義的字符串:單引號
雙引號定義的字符串:class java.lang.Boolean
雙引號定義的字符串:true
雙引號定義的字符串:true
單引號定義的字符串:$str2


BUILD SUCCESSFUL in 1s

集合

Groovy 中也有集合的概念,主要看一下常用的 List、Map,下面將對 List 和 Map 常用操作進(jìn)行介紹。

那么如何在 Groovy 中定義 List 呢,Groovy 中的 List 的定義方式類似于 Java 中的數(shù)組,具體操作參考下面代碼:

task list{
    //定義List
    def list = [1,2,3,4,5,6];
    def weekList = ['星期一','星期二','星期三','星期四','星期五','星期六','星期日'];
    println "list的類型:"+list.class
    println "weekList的類型:"+weekList.class
    
    //訪問集合里面的元素
    println '第一個(gè)元素:'+list[0]//訪問第一個(gè)元素
    println '第二個(gè)元素:'+list[1]//訪問第二個(gè)元素,以此類推
    
    println '最后一個(gè)元素:'+list[-1]//訪問最后一個(gè)元素
    println '倒數(shù)第二個(gè)元素:'+list[-2]//訪問倒數(shù)第二個(gè)元素,以此類推
    println '某個(gè)范圍內(nèi)元素:'+list[2..4]//訪問某個(gè)范圍內(nèi)元素,以此類推
    
    //使用each遍歷集合中的元素
    weekList.each{
        //使用it作為迭代的元素變量,不能寫錯(cuò)喔
        println it
    }
}

下面是上述代碼的執(zhí)行結(jié)果,參考如下:

PS E:\Gradle\study\Groovy\ListMap> gradle list

> Configure project :
list的類型:class java.util.ArrayList
weekList的類型:class java.util.ArrayList
第一個(gè)元素:1
第二個(gè)元素:2
最后一個(gè)元素:6
倒數(shù)第二個(gè)元素:5
某個(gè)范圍內(nèi)元素:[3, 4, 5]
星期一
星期二
星期三
星期四
星期五
星期六
星期日


BUILD SUCCESSFUL in 2s

那么如何在 Groovy 中定義 Map 呢,Groovy 中的 Map 當(dāng)然也是鍵值對,具體定義及操作參考下面代碼:

task map{
    
    //定義Map
    def map = ['name':'Groovy', 'age':10];
    println "map的類型:"+map.getClass().name;
    
    //訪問Map里面的元素
    println map.name;
    println map['name'];
    
    //遍歷Map中的元素
    map.each{
        println "Key:${it.key},value:${it.value}"
    }
}

下面是上述代碼的執(zhí)行結(jié)果,參考如下:

PS E:\Gradle\study\Groovy\ListMap> gradle map

> Configure project :
map的類型:java.util.LinkedHashMap
Groovy
Groovy
Key:name,value:Groovy
Key:age,value:10


BUILD SUCCESSFUL in 2s

關(guān)于 Groovy 的集合就了解這么多。

方法

Groovy 中的方法和 Java 中的方法類似,只是寫法上更加靈活,Groovy 中 return 不是必須的,在不寫 return 的時(shí)候,Groovy 會將最后一句代碼作為該方法的返回值。代碼塊指的是一段被花括號包圍的代碼,Groovy 中可將代碼塊作為一個(gè)參數(shù)進(jìn)行傳遞,可以參考前面關(guān)于集合的遍歷部分,參考代碼如下:

task method{
    //方法調(diào)用
    methodA(1, 2)
    methodA 1, 2 
    
    //獲取方法返回的結(jié)果
    def a = methodA 10, 20
    println '獲取方法返回的結(jié)果:'+a
    
    //代碼塊作為參數(shù)傳遞
    def list = [1,2,3,4,5];
    list.each(
        //閉包參數(shù)
        {
        //    println it
        }
    )
    
    //Groovy規(guī)定,如果方法的最后一個(gè)參數(shù)是閉包,可以直接放到方法外面
    list.each(){
    //    println it
    }
    
    //簡寫方式
    list.each{
        println it
    }
}

//方法的定義
def methodA(int a, int b){
    println a + b
    //Groovy中return語句不是必須的,默認(rèn)將最后一句代碼的結(jié)果作為返回值
    a + b
}

下面是上述代碼參考如下:

PS E:\Gradle\study\Groovy\Method> gradle method

> Configure project :
3
3
30
獲取方法返回的結(jié)果:30
1
2
3
4
5


BUILD SUCCESSFUL in 2s

JavaBean

Groovy 中的 JavaBean 相較 Java 中的比較靈活,可以直接使用 javaBean.屬性的方式獲取和修改 JavaBean 的屬性值,無需使用相應(yīng)的 Getter、Setter 方法,直接看代碼:

task javaBean{
    //Groovy中定義JavaBean
    Student student = new Student()
    student.name = "Groovy"
    student.age = 10
    
    student.setName("Gradle")
    println "名字是:"+student.name
    //不能調(diào)用Getter方法獲取值
//    println "名字是:"+student.getName
    println "年齡是:${student.age}"
    println "分?jǐn)?shù)是:"+student.score
}

class Student{
    private String name
    private int age
    //定義的Getter方法所對應(yīng)的屬性可以直接調(diào)用
    public String getScore(){
        100
    }
    
    //屬性的Getter、Setter方法
    public String setName(String name){
        this.name = name
    }
    
    public void getName(){
        name
    }
}

下面是上述代碼的執(zhí)行結(jié)果:

PS E:\Gradle\study\Groovy\JavaBean> gradle javaBean

> Configure project :
名字是:Gradle
年齡是:10
分?jǐn)?shù)是:100


BUILD SUCCESSFUL in 2s

閉包

閉包是大多數(shù)腳本語言具有的一個(gè)特性,如 JavaScript、Groovy 等,閉包就是一個(gè)使用花括號包圍的代碼塊,下面來學(xué)習(xí) Groovy 中的閉包,主要有兩部分:閉包及閉包參數(shù)傳遞和閉包委托。

閉包及其參數(shù)傳遞

下面來看一下如何定義一個(gè)閉包以及相關(guān)參數(shù)的傳遞,直接上代碼:

task closure{
    //自定義閉包的執(zhí)行
    mEach{
        println it
    }
    
    //向閉包傳遞參數(shù)
    mEachWithParams{m,n -> //m,n ->將閉包的參數(shù)和主體區(qū)分離開來
        println "${m} is ${n}"
    }
}

//1.定義一個(gè)方法,參數(shù)closure用于接收閉包
//2.閉包的執(zhí)行就是花括號里面代碼的執(zhí)行
//3.閉包接收的參數(shù)就是閉包參數(shù)closure參數(shù)中的i,如果是一個(gè)參數(shù)默認(rèn)就是it變量
def mEach(closure){
    for(int i in 1..5){
        closure(i)
    }
}

//向閉包傳遞參數(shù)
def mEachWithParams(closure){
    def map = ["name":"Groovy","age":10]
    map.each{
        closure(it.key, it.value)
    }
}

上面代碼中定義了閉包以及如何進(jìn)行閉包的參數(shù)的傳遞,當(dāng)閉包只有一個(gè)參數(shù)時(shí),默認(rèn)就是 it,反之閉包有多個(gè)參數(shù)時(shí),就需要將參數(shù)定義出來,具體可參考上述代碼,下面是執(zhí)行結(jié)果:

PS E:\Gradle\study\Groovy\Closure> gradle delegate

> Configure project :
1
2
3
4
5
name is Groovy
age is 10

BUILD SUCCESSFUL in 2s
閉包委托

Groovy 閉包的強(qiáng)大之處在于它支持閉包方法的委托,Groovy 的閉包有三個(gè)屬性:thisObject、owner、delegate,當(dāng)在一個(gè)閉包中調(diào)用定義的方法時(shí),由這三個(gè)屬性來確定該方法由哪個(gè)對象來執(zhí)行,默認(rèn) owner 和 delegate 是相等的,其中 delete 是可以被修改的,Gradle 中閉包的很多功能都是通過修改 delegate 來實(shí)現(xiàn)的。下面通過定義一個(gè)閉包以及方法,通過打印來說明這三個(gè)屬性的一些區(qū)別:

//閉包的委托
task delegate{
    new Delegate().test{
        //Groovy閉包的三個(gè)屬性:thisObject、owner、delegate
        println "thisObject:${thisObject.getClass()}"
        println "owner:${owner.getClass()}"
        println "delegate:${delegate.getClass()}"
        
        //閉包默認(rèn)it
        println "閉包默認(rèn)it:"+it.getClass()
        
        //定義的方法,優(yōu)先使用thisObject來處理
        method()
        //閉包中的方法
        it.method()
    }
}

def method(){
    println "mththod in root:${this.getClass()}"
}

class Delegate{
    def method(){
        println "mththod in Delegate:${this.getClass()}"
    }
    
    //閉包
    def test(Closure<Delegate> closure){
        closure(this);
    }
}

下面是上述代碼的執(zhí)行結(jié)果,參考如下:

PS E:\Gradle\study\Groovy\Closure> gradle delegate

> Configure project :

thisObject:class build_3ajca04o1rprxygcsq0ajvt7i
owner:class build_3ajca04o1rprxygcsq0ajvt7i$_run_closure2
delegate:class build_3ajca04o1rprxygcsq0ajvt7i$_run_closure2
閉包默認(rèn)it:class Delegate
mththod in root:class build_3ajca04o1rprxygcsq0ajvt7i
mththod in Delegate:class Delegate


BUILD SUCCESSFUL in 2s

當(dāng)在閉包中調(diào)用方法 method() 時(shí),發(fā)現(xiàn)是 thisObject 調(diào)用了 method() 方法,而不是 owner 或 delegate,說明閉包中優(yōu)先使用 thisObject 來處理方法的執(zhí)行,同時(shí)可以看到 owner 和 delegate 是一致的,但是 owner 比 delegate 的優(yōu)先級要高,所以閉包中方法的處理順序是:thisObject > owner > delegate。

Gradle 中一般會指定 delegate 為當(dāng)前的 it,這樣我們將可以通過 delegate 指定的對象來操作 it 了,下面指定閉包的 delegate 并設(shè)置委托優(yōu)先,讓委托的具體對象來執(zhí)行其方法,下面是測試代碼:

task student{
    configStudent{
        println "當(dāng)前it:${it}"
        
        name = "Groovy"
        age = 10
        getInfo()
    }
}

class Student{
    String name
    int age
    def getInfo(){
        println "name is ${name}, age is ${age}"
    }
}

def configStudent(Closure<Student> closure){
    Student student = new Student()
    //設(shè)置委托對象為當(dāng)前創(chuàng)建的Student實(shí)例
    closure.delegate = student
    //設(shè)置委托模式優(yōu)先,如果不設(shè)置閉包內(nèi)方法的處理者是thisObject
    closure.setResolveStrategy(Closure.DELEGATE_FIRST)
    //設(shè)置it變量
    closure(student)
}

下面是上述代碼的執(zhí)行結(jié)果,參考如下:

PS E:\Gradle\study\Groovy\Closure> gradle student

> Configure project :

當(dāng)前it:Student@18f6d755
name is Groovy, age is 10


BUILD SUCCESSFUL in 2s

總結(jié)

學(xué)習(xí) Groovy 的目的還是為了加深對 Gradle 構(gòu)建工具的理解,上面通過五個(gè)方面對 Groovy 有了初步的人認(rèn)識,后續(xù)如果有需要在看 Groovy 的高級用法。

1.png

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多