Hello Groovy

Groovy 是基于JVM虛擬機的一種動態(tài)語言萨咳,語法和Java非常相似垮刹。Groovy完全兼容Java,又在此基礎(chǔ)上增加很多動態(tài)類型和靈活的特性鸵隧,比如閉包绸罗,支持DSL,是一門非常靈活的動態(tài)腳本語言豆瘫。

每個Gradle的腳本文件都是一個Groovy腳本文件珊蟀,可以在里面寫任何符合Groovy語法代碼,比如自定義類外驱,聲明函數(shù)育灸,定義變量等。Groovy又完全兼容Java昵宇,這 意味著在build腳本文件里寫任何的Java代碼描扯,非常靈活方便。

字符串

' ' " " 都代表字符串趟薄,但是單引號沒有運算能力,而雙引號具有運算能力

task printStringClass  {
    def str1='單引號'
    def str2="雙引號"
    println "單引號定義的字符串類型:"+str1.getClass().name
    println "雙引號定義的字符串類型:"+str2.getClass().name
    def name="張三"
    println '單引號變量計算${name}'
    println "雙引號變量計算${name}"
}

集合

  • List
task printList{
    def numList=[1,2,3,4,5,6]
    println numList.getClass().name

    //訪問第二個元素
    println numList[1]
    //訪問最后一個元素
    println numList[-1]
    //訪問第二到第四個元素
    println numList[1..3]

    numList.each{
        println it
    }
}
  • Map
task printMap{
    def map=['width':1024,'height':768]

    println map.getClass().name


    println map['width']
    println map.height


    map.each{
        println "key:${it.key}  value:${it.value}"
    }

}

方法

  • 括號可以省略
task invokeMethod{

    method1(1,2)
    method1 2,3

}

def method1(int a,int b){
   println a+b
}
  • return 可以不寫
task printMethodPrint{
    def add1=method2 1,2
    def add2=method2 2,3

    println "add1:${add1}  add2:${add2}"
}

def method2(int a,int b){
    if(a>b){
        a
    }else{
        b
    }
}
  • 代碼塊可以作為參數(shù)傳遞
  map.each({
        println it
        })

    map.each(){
        println it
    }

    map.each{
        println it
    }
  • JavaBean
class Person{
    private String name;
}

task hellJavaBean{
    Person p=new Person()

    println "name : ${p.name}"

    p.name="zhangsan"

    println "name: ${p.name}"
}

閉包

是Groovy的一個非常重要的特性典徊,可以說它是DSL基礎(chǔ)杭煎。閉包不是Groovy的首創(chuàng)恩够,但是它支持這一重要特性。

  • 自定義閉包
task helloClosure{
    customEach{
        println it
    }
}

def customEach(closure){
    for(int i in 1..10){
        closure(i)
    }
}
  • 向閉包傳遞參數(shù)
task helloClosure{
    //多個參數(shù)
    eachMap{
        k,v -> println "k:$k  v:$v"
    }
}

def eachMap(closure){
    def map=["name":"zhangsan","age":18]
    map.each{
        closure(it.key,it.value)
    }
}
  • 閉包委托

Groovy閉包有thisObject/owner/delegate 三個屬性羡铲,當你在閉包內(nèi)調(diào)用方式時蜂桶,由它們來確定使用哪個對象來處理。默認情況下delegate/owner是相等的也切,但是delegate是可以被修改的扑媚,這個功能非常強大,Gradle中閉包的很多功能都是通過修改delegate實現(xiàn)的雷恃。

task helloDelegate{
    new Delegate().test{
        println "thisObject:${thisObject.getClass()}"
        println "owner:${owner.getClass()}"
        println "delegate:${delegate.getClass()}"
        method3()
        it.method1()
    }
}


def method3(){

        println "Context this:${this.getClass()} in root"

        println "method3 in root"

}

class Delegate{
    def method1(){
        println "Delegate this:${this.getClass()} in Delegate"

        println "method1 in Delegate"
    }

    def test(Closure<Delegate> closure){
        closure(this)
    }
}
task configClosure{

    personMethod{
        personName="zs"
        personAge=10
        dumpPerson()
    }

}


class PersonObj{
    String personName
    int personAge

    def dumpPerson(){
        println "name is ${personName} age is ${personAge}"
    }
}

def personMethod(Closure<PersonObj> closure){
    PersonObj p=new PersonObj()
    closure.delegate=p
    //委托模式優(yōu)先
    closure.setResolveStrategy(Closure.DELEGATE_FIRST)
    closure(p)
}

DSL

Domain Specific Language 領(lǐng)域特定語言疆股,是專門關(guān)注某一領(lǐng)域的語言,它在于專倒槐,而不是全旬痹。Gradle就是一門DSL,它是基于Groovy讨越,專門解決自動化構(gòu)建的DSL两残。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市把跨,隨后出現(xiàn)的幾起案子人弓,更是在濱河造成了極大的恐慌,老刑警劉巖着逐,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崔赌,死亡現(xiàn)場離奇詭異,居然都是意外死亡滨嘱,警方通過查閱死者的電腦和手機峰鄙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來太雨,“玉大人吟榴,你說我怎么就攤上這事∧野猓” “怎么了栅隐?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵叨恨,是天一觀的道長。 經(jīng)常有香客問我,道長妄帘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任点把,我火速辦了婚禮粉捻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己碗殷,他們只是感情好精绎,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锌妻,像睡著了一般代乃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仿粹,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天搁吓,我揣著相機與錄音,去河邊找鬼吭历。 笑死堕仔,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的毒涧。 我是一名探鬼主播贮预,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼契讲!你這毒婦竟也來了仿吞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捡偏,失蹤者是張志新(化名)和其女友劉穎唤冈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體银伟,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡你虹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彤避。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傅物。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琉预,靈堂內(nèi)的尸體忽然破棺而出董饰,到底是詐尸還是另有隱情,我是刑警寧澤圆米,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布卒暂,位于F島的核電站,受9級特大地震影響娄帖,放射性物質(zhì)發(fā)生泄漏也祠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一近速、第九天 我趴在偏房一處隱蔽的房頂上張望诈嘿。 院中可真熱鬧堪旧,春花似錦、人聲如沸永淌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遂蛀。三九已至,卻和暖如春干厚,著一層夾襖步出監(jiān)牢的瞬間李滴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工蛮瞄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留所坯,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓挂捅,卻偏偏與公主長得像芹助,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子闲先,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容