進過上一篇 入門篇 以後,咱們正式開始學 Groovy。bash
咱們這些使用 Java 語言的,學習 Groovy 基本沒有難度,不過須要注意一些特性,好比支持「閉包」、支持「DSL」。是一門很是靈活的動態腳本語言。閉包
Groovy 沒有分號,別不習慣。post
List、Set、Map、Queue 挺熟悉吧。通常咱們經常使用 List 和 Map 。學習
def numList = [1,2,3,4,5]
println numList.getClass().name
複製代碼
這是否是赤裸裸的 Java 家的東西啊,哈哈~~ this
def numList = [1,2,3,4,5]
println numList.getClass().name
println numList[0]
println numList[-1]
println numList[0..3]
numList.each{
println it
}
複製代碼
能夠循環打印,連續打印挺方便的。it 變量是正在迭代的元素,涉及閉包的知識。spa
def map1 = ['width':1024,'height':720,'name':'小明']
println map1.getClass().name
println map1['width']
println map1.height
println map1['name']
map1.each{
println "Key:${it.key},Value:${it.value}"
}
複製代碼
括號能夠省略代理
method1(1,2)
method1 1,2
def method1(int a,int b){
println a + b
}
複製代碼
return 能夠不寫 Groovy 會把方法執行過程當中的最後一句代碼做爲返回值。code
println method1 (1,2)
def method1(int a,int b){
a + b
}
複製代碼
原本集合的 each 方法,參數其實就是一個閉包cdn
numList.each({println it})
複製代碼
Groovy 規定若是方法的最後一個參數是閉包,能夠放到方法的外面對象
numList.each(){
println it
}
複製代碼
而後 方法能夠省略
numList.each{
println it
}
複製代碼
原來咱們平時看到樣式,還有這麼一個演化史。
咱們沒必要像 Java 那樣寫 getter setter 方法了。更懶得是,你寫個 getAge 方法,會給你定義一個 age 變量。
class Person{
private String name;
public getAge(){
11
}
}
Person p = new Person()
println "名字是:"+p.name
p.name = '小明'
println "名字是:"+p.name
println "age:"+p.age
複製代碼
說句實話,我之前也是一直不懂閉包是什麼。咱們經過運用理解一下。
首先咱們以前用過 集合的 each 方法,那麼咱們本身也來實現這個功能。
這 closure 參數用來接收 閉包代碼塊
def customEach(closure){
for(int i in 1..10){
closure i
}
}
//進化調用
customEach({println it})
customEach(){println it}
customEach{println it}
複製代碼
當閉包只有一個參數的時候,默認他本身就是 it ,可是多個參數呢?
def customEachMap(closure){
def map1 = ['width':1024,'height':720,'name':'小明']
map1.each{
closure(it.key,it.value)
}
}
customEachMap{
k,v ->
println "${k} is ${v}"
}
複製代碼
咱們能夠看到這裏就不能使用 it 了,而是顯示的聲明出來,好比 k,v-> 用於閉包的參數和主體區分開來。
Groovy 閉包還支持閉包方法的委託。 Groovy 閉包有 thisObject、owner、delegate 三個屬性。默認狀況下 delegate 和 owner 是相等的,可是 delegate 是能夠被修改的。Gradle 中閉包的不少功能都是經過修改 delegeta 來實現的。
咱們從結果來看, thisObject 就是這個構建腳本的上下文。 delegale 和 owner 是同樣的,優先級是 thisObject > owner > delegate 。 當咱們在 DSL,好比 Gradle 中的時候,通常會指定delegate 爲當前的it,因此咱們在閉包內能夠對這個 it 進行配置。
class Student{
String name;
int age;
def dumpStudent(){
println "name is ${name} ,age is ${age}"
}
}
def student (Closure<Student> closure){
Student p = new Student()
closure.delegate = p;
//委託模式優先
closure.setResolveStrategy(Closure.DELEGATE_FIRST);
closure(p)
}
複製代碼
Student studnet1 = new Student()
studnet1.age = 10
studnet1.dumpStudent()
student{
name = '大明'
age = 20
dumpStudent()
}
複製代碼
其實就是 delegate 代理了對象,經過閉包,來操做對象。
劃重點: 本文是徹底參考 《Android Gradle 權威指南》而寫,做爲學習筆記使用。