進過上一篇 入門篇 之後,我們正式開始學 Groovy。
我們這些使用 Java 語言的,學習 Groovy 基本沒有難度,不過需要注意一些特性,比如支援「閉包」、支援「DSL」。是一門非常靈活的動態指令碼語言。
Groovy 沒有分號,別不習慣。
一、集合
List、Set、Map、Queue 挺熟悉吧。一般我們常用 List 和 Map 。
def numList = [1,2,3,4,5]
println numList.getClass().name
複製程式碼
這是不是赤裸裸的 Java 家的東西啊,哈哈~~
1、List
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 變數是正在迭代的元素,涉及閉包的知識。
2、Map
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}"
}
複製程式碼
二、方法
1、省略
括號可以省略
method1(1,2)
method1 1,2
def method1(int a,int b){
println a + b
}
複製程式碼
return 可以不寫 Groovy 會把方法執行過程中的最後一句程式碼作為返回值。
println method1 (1,2)
def method1(int a,int b){
a + b
}
複製程式碼
2、程式碼塊可以作為引數傳遞
本來集合的 each 方法,引數其實就是一個閉包
numList.each({println it})
複製程式碼
Groovy 規定如果方法的最後一個引數是閉包,可以放到方法的外面
numList.each(){
println it
}
複製程式碼
然後 方法可以省略
numList.each{
println it
}
複製程式碼
原來我們平時看到樣式,還有這麼一個演化史。
三、JavaBean
我們不必像 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
複製程式碼
四、閉包
說句實話,我以前也是一直不懂閉包是什麼。我們通過運用理解一下。
1、傳遞引數
首先我們之前用過 集合的 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-> 用於閉包的引數和主體區分開來。
2、閉包委託
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 權威指南》而寫,作為學習筆記使用。