Gradle for Android 第七篇( Groovy入門 )

這一系列暫不更新,相關技術討論,請移步微信羣,謝謝,但願你們多多支持!java

圖片描述

這會是一個系列,因此若是你看完這篇文章,請看下列文章:segmentfault

Gradle for Android 第一篇( 從 Gradle 和 AS 開始 )微信

Gradle for Android 第二篇( Build.gradle入門 )閉包

Gradle for Android 第三篇( 依賴管理 )學習

Gradle for Android 第四篇( 構建變體 )測試

Gradle for Android 第五篇( 多模塊構建 )gradle

Gradle for Android 第六篇( 測試)ui

迄今爲止,咱們已經學些了衆多gradle構建的概念以及如何運行tasks。在這一章,咱們將對這些概念有一個更深的理解,而後開始構建咱們本身的tasks。一旦咱們掌握瞭如何編寫自定義tasks,那麼咱們就能夠試着編寫本身的插件,以達到在多個項目中複用的目的。spa

在咱們建立傳統tasks以前,咱們有必要了解些Groovy的基本語法。由於這理解Groovy如何運行會使得咱們能更好的理解tasks和插件。理解Groovy一樣幫助咱們理解Gradle如何工做,以及爲何這些配置文件須要這樣配置。插件

在這一章,咱們將會遵循如下主題:

  • 理解Groovy

  • 從新認識tasks

  • Hooking Android插件

  • 編寫自定義插件

理解Groovy

大部分Android開發者也是名Java開發者,和Java對比,Groovy也是運行在JVM上。固然,若是你是名Java開發者,那麼Groovy將會變得容易閱讀,可是在編寫你本身的Groovy代碼以前,你必須對Groovy有一個全面的瞭解。

簡介

Groovy起源於Java,其運行在JVM上。其目標是創造更簡單,更直接的語言,不只僅在腳本語言上或者編譯語言上運行。經過這一章節,咱們將對Groovy和Java進行對比。

在Java中,打印一天String應該是這樣的:

System.out.println("Hello, world!");

在Groovy中,你能夠這麼寫:

println 'Hello, world!'

你應該主要到幾點不一樣之處:

  • 沒有了System.out

  • 沒有了方括號

  • 列結尾沒有了;

這個例子一樣使用了單引號,你可使用雙引號或者單引號,可是他們有不一樣的用法。雙引號能夠包含插入語句。插入是計算一個字符串包含placeholders的過程,並將placeholders的值替換,這些placeholder能夠是變量甚至是方法。Placeholders必須包含一個方法或者變量,而且其被{}包圍,且其前面有$修飾。若是其只有一個單一的變量,能夠只須要$。下面是一些基本的用法:

def name = 'Andy'
def greeting = "Hello, $name!"
def name_size "Your name is ${name.size()} characters long."

greeting應該是「 Hello,Andy」,而且 name_size 爲 Your name is 4 characters long.string的插入可讓你更好的動態執行代碼。好比

def method = 'toString'
 new Date()."$method"()

這在Java中看起來很奇怪,可是這在groovy裏是合法的。

Classes和members

Groovy裏面建立類和Java相似,舉個例子:

class MyGroovyClass {
       String greeting
       String getGreeting() {
           return 'Hello!'
        } 
}

注意到不管是類名仍是成員變量都沒有修飾符。其默認的修飾符是類和方法爲public,成員變量爲private。

當你想使用MyGroovyClass,你能夠這樣實例化:

def instance = new MyGroovyClass()
instance.setGreeting 'Hello, Groovy!'
instance.getGreeting()

你能夠利用def去建立變量,一旦你爲你的類建立了實例,你就能夠操做其成員變量了。get/set方法groovy默認爲你添加 。你甚至能夠覆寫它。

若是你想直接使用一個成員變量,你能夠這麼幹:

println instance.getGreeting()
 println instance.greeting

而這二種方式都是可行的。

方法

和變量同樣,你沒必要定義爲你的方法定義返回類型。舉個例子,先看java:

public int square(int num) {
       return num * num;
} 
square(2);

你須要將該方法定義爲public,須要定義返回類型,以及入參,最後你須要返回值。

咱們再看下Groovy的寫法:

def square(def num) {
       num * num
 }
 square 4

沒有了返回類型,沒有了入參的定義。def代替了修飾符,方法體內沒有了return關鍵字。然而我仍是建議你使用return關鍵字。當你調用該方法時,你不須要括號和分號。

咱們設置能夠寫的更簡單點:

def square = { num ->
       num * num
}
square 8

###閉包

閉包是一段匿名的方法體,其能夠接受參數和返回值。它們能夠定義變量或者能夠將參數傳給方法。

你能夠簡單的使用方括號來定義閉包,若是你想詳細點,你也能夠這麼定義:

Closure square = {
       it * it
}
square 16

添加了Closure,讓其更加清晰。注意,當你沒有顯式的爲閉包添加一個參數,groovy會默認爲你添加一個叫作it。你能夠在全部的閉包中使用it,若是調用者沒有定義任何參數,那麼it將會是null,這會使得你的代碼更加簡潔。

在grade中,咱們常用閉包,例如Android代碼體和dependencies也是。

Collections

在groovy中,有二個重要的容器分別是lists和maps。

建立一個list很容易,咱們沒必要初始化:

List list = [1, 2, 3, 4, 5]

爲list迭代也很簡單,你可使用each方法:

list.each() { element ->
       println element
}

你甚至可使得你的代碼更加簡潔,使用it:

list.each() {
       println it
}

map和list差很少:

Map pizzaPrices = [margherita:10, pepperoni:12]

若是你想取出map中的元素,可使用get方法:

pizzaPrices.get('pepperoni')
pizzaPrices['pepperoni']

一樣的groovy有更簡單的方式:

pizzaPrices.pepperoni

是否是簡單到爆,瞬間感受Java太複雜的有木有。下一章咱們將學習Groovy在Gradle中的使用狀況,相信你會喜歡!

相關文章
相關標籤/搜索