不得不學之「 Gradle」 ② Groovy

Mr.S發表於2019-04-02

進過上一篇 入門篇 之後,我們正式開始學 Groovy。

我們這些使用 Java 語言的,學習 Groovy 基本沒有難度,不過需要注意一些特性,比如支援「閉包」、支援「DSL」。是一門非常靈活的動態指令碼語言。

Groovy 沒有分號,別不習慣。

一、集合

List、Set、Map、Queue 挺熟悉吧。一般我們常用 List 和 Map 。

def numList = [1,2,3,4,5]
println numList.getClass().name
複製程式碼

這是不是赤裸裸的 Java 家的東西啊,哈哈~~

不得不學之「 Gradle」 ② Groovy

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 變數是正在迭代的元素,涉及閉包的知識。

不得不學之「 Gradle」 ② Groovy

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}"
	}
複製程式碼

不得不學之「 Gradle」 ② Groovy

二、方法

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
	}
複製程式碼

不得不學之「 Gradle」 ② Groovy

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
複製程式碼

不得不學之「 Gradle」 ② Groovy

四、閉包

說句實話,我以前也是一直不懂閉包是什麼。我們通過運用理解一下。

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 來實現的。

不得不學之「 Gradle」 ② Groovy

我們從結果來看, 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()
}
複製程式碼

不得不學之「 Gradle」 ② Groovy

其實就是 delegate 代理了物件,通過閉包,來操作物件。

劃重點: 本文是完全參考 《Android Gradle 權威指南》而寫,作為學習筆記使用。

相關文章