日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Gradle 之语言基础 Groovy

發布時間:2024/4/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gradle 之语言基础 Groovy 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在學習 Android 中 Gradle 相關的知識,如果想學好 Gradle,必要的 Groovy 基礎是不可少的。Groovy 語言的知識也是非常多的,如果只是想在 Android Gradle 這個范圍內使用 Groovy,會 Groovy 的基礎即可,Groovy 語言文檔。

一. Android Gradle 概述

Groovy 是從 Java 衍生出來的,Groovy 的源代碼文件 .groovy 也是編譯成為 .class 文件,然后運行在 JVM 虛擬機上的。其目標是,不管是作為腳本語言,還是編程語言,都可以簡單、直接的使用。在 Android 的 Gradle 中,Groovy 更多的是用于編寫腳本。如果會 Java,學習 Groovy 會比較簡單,甚至可以混寫 Java 和 Groovy 語法。

Groovy 相比 Java 語言來講,更加的方便靈活,更多的語法糖使編寫 Groovy 代碼更加的簡潔,而且在 Groovy 中具有函數式編程的思想。比如:Groovy 中非常重要的閉包 Closure 概念(類似于 C 語言中的函數指針),可以當做一個函數也執行,也可以當做某個函數的參數傳入到函數中去,也可以當做一個函數的返回值返回。

想學好 Gradle,除了必要的 Groovy 知識基礎以外,還需要了解其他兩個基礎知識:Android DSL 和 Gradle DSL。 DSL 是 Domain Specific Language(領域特定語言)的縮寫,其定義是:針對某一領域,具有受限表達性的一種計算機程序設計語言。學習 Android Gradle,Android DSL 和 Gradle DSL 也是需要學習的,好在有官方的文檔 Android DSL 文檔 和 Gradle DSL 文檔,學習起來就比較方便。在這篇文章中,不會過多地介紹 Android DSL 和 Gradle DSL,在下篇文章中會介紹。

好了,廢話不多說,接下來就來學習 Groovy 的語法基礎吧。為了學習的時候,可以執行 gradle 腳本,請先在電腦上配置好 gradle 的環境變量,這樣就可以方便地執行 gradle 腳本了。

二. Groovy 語言基礎

由于篇幅所限,本篇文章也只能作為一個引子,介紹基礎的 Groovy 語言概念,詳細的還需要從 Groovy 語言文檔 學習。而且我個人認為,如果遇到什么不懂的、不會的,從官方文檔上學習是最好的學習途徑;或者至少先從官方文檔上學習,再去學習其他的資料,將自己學習的和資料的進行對比思考,這樣會更有助于個人的成長

為了避免無意義的內容,只介紹和 Java 有區別的地方,相同的地方不作說明。

2.1 變量

  • Groovy 中聲明的變量,默認的修飾符是 public 的
  • Groovy 中聲明變量時,如果一行只聲明一個變量則可以省略末尾的 ;,但是如果一行聲明了多個變量,變量與變量之間則不可以省略 ;
  • 在 Groovy 中聲明變量,也可以使用關鍵字 def,def 只是聲明了一個變量,變量的實際類型根據該變量的對象決定。def 和 JavaScript 中的 val 有點像,從 def 可以看出 Groovy 也是一門動態語言
  • Groovy 中字符串 String,可以使用單引號 'String',也可以使用雙引號 "String"
  • 在 Groovy 中的 String,可以通過 ${} 做占位符表達式向字符串中插入值,在 {} 中寫表達式或變量都可以,使用 ${} 的字符串必須使用雙引號 ""
  • int version = 1 Boolean isDebug = true def language = 'groovy' def message = "Hello from ${language + 1}, the result is ${isDebug}."task hello {doLast{println message } } 復制代碼

    上面代碼的執行輸出是:

    > Task :hello Hello from groovy1, the result is true. 復制代碼

    2.2 List

  • 因為在 Groovy 中沒有定義任何集合類,所以 Groovy 中的 List 使用的是 JDK 中的 java.util.List
  • 在 Groovy 中的一個 List 中可以添加多種類型的對象元素
  • 創建 List 對象使用 [],而不是 Java 中的 {},防止和 Groovy 中的 閉包 Closure {} 混淆
  • 可以通過 [index] 的方式修改和訪問 List 中的元素
  • 可以通過 << 向 List 中添加元素,<< 實際是 leftShift() 方法
  • 可以通過負數,從后向前訪問 List 中的元素,比如 [-1] 表示最后一個元素
  • 可以通過 [index1, index2] 同時訪問 List 中的多個元素,返回結果仍是一個List
  • 可以通過 [index1..index2] 一次性訪問 List 中某個范圍內的數組,返回結果也是一個 List
  • ArrayList arrayList = ['arrayOne', 'arrayTwo', 'arrayThree'] LinkedList linkedList = ['linkedOne', 'linkedTwo', 'linkedThree'] List list = [1, 2, true] def listDef = ['one', 2, true, 4, '5']task helloList {doLast {println listDefprintln arrayListprintln linkedListprintln listprintln list[0]println list[-1]list << 4println list[-1]println list[1, 3]println list[1..3]} } 復制代碼

    輸出如下所示:

    > Task :app:helloList [one, 2, true, 4, 5] [arrayOne, arrayTwo, arrayThree] [linkedOne, linkedTwo, linkedThree] [1, 2, true] 1 true 4 [2, 4] [2, true, 4]復制代碼

    2.3 Arrays

    Groovy 中的數組和 Java 中的數組區別并不大,也不過多的做介紹

  • Groovy 中的數組使用 [] 初始化,并不使用 {},防止和 Groovy 中的 閉包 Closure {} 混淆
  • 數組不支持 << 向 Arrays 中添加元素
  • String[] arrayStrings = ["one", "two", 'three']; def arrayInts = [1, 2, 3] as int[]task hello {doLast {println arrayStrings[0]println arrayStrings[1]println arrayStrings[-1]// arrayStrings << 'four' // Arrays 不支持 << println arrayStringsprintln arrayInts} } 復制代碼

    輸出如下所示:

    > Task :hello one two three [one, two, three] [1, 2, 3] 復制代碼

    2.4 Map

  • Groovy 中的 Map 是以 : 作為 key 和 value 的連接,并且以 , 做為每一項的分隔符的
  • Map 中的 key 既可以是字符串也可以是阿拉伯數字
  • 可以通過 [key] 和 .key 的形式訪問或向 map 中賦值,訪問的時候如果不存在該 key,則會返回 null
  • 如果以變量作為 key 訪問 map 時,記得需要加上 ()
  • def maps = [red: '#FF0000', green: '#00FF00', blue: '#0000FF'] def mapNums = [1: 'one', 2: 'two', 3: 'three', 100: 'four']def key = 'name' def mapKey = [key: 'value'] def mapKey1 = [(key): 'value1']task helloMaps {doLast {println maps['red']println maps.greenmaps['pink'] = '#FF00FF'maps.yello = '#FFFF00'println maps['pink']println maps.yelloprintln maps.whiteprintln mapNums[1]println mapNums[100]println mapNums[5]println mapKey['key']println mapKey['name']println mapKey1['name']} } 復制代碼

    上述代碼的輸出是

    > Task :app:helloMaps #FF0000 #00FF00 #FF00FF #FFFF00 null one four null value null value1 復制代碼

    2.5 Class 和對象

    Groovy 中的 Class 和 Java 中的 Class 區別并不大,主要有以下幾個區別

  • 如果類、方法沒有修飾符的話,默認是 public 修飾符的
  • 如果類中的變量 fields 沒有被修飾符修飾的話,會自動成為一個 properties,properties 是公有的,并且會自動生成該 properties 的 setter 和 getter 方法
  • 在 Java 中,文件名和主類的名稱必須一致,但是 Groovy 中并沒有這個限制,且在一個 Groovy 文件中可以出現多個 public 的類
  • 在一個 Groovy 文件中可以在類之外定義方法或語句,這種文件就是腳本了
  • class Student {def namedef ageprivate String workpublic String loverdef Student(String name) {this.name = name} }task helloClass {doLast {def student = new Student('lijiankun24')println student.nameprintln student.getAge()println student.lover// println student.getLover() // Student 中并沒有 getLover() 這個方法// println student.getWork() // Student 中并沒有 getWork() 這個方法} } 復制代碼

    輸出結果如下:

    > Task :app:helloClass lijiankun24 null null 復制代碼

    2.6 函數

    Groovy 中的函數和 Java 中的函數并沒有太大的區別

  • 函數一定會有返回值,如果沒有顯示的使用 return 返回值的話,函數的最后一行語句的執行結果作為值返回,可能返回值是個 null
  • 如果函數有參數,調用函數的時候,可以省略函數的括號,函數名和參數之間需要用空格間隔;如果函數沒有參數,調用函數的時候就不能省略括號
  • 函數內不可以訪問函數外的變量
  • def message = 'message'def printMessage () {println message }void printName(String name) {println name }void printPerson(String name, age) {println "The name is ${name} and the age is ${age}" }task helloFunction {doLast {println printName('xiaoming')printPerson 'xiaoming', 20// println printMessage() 會執行異常} } 復制代碼

    輸出結果如下所示:

    > Task :app:helloFunction xiaoming null The name is xiaoming and the age is 20 復制代碼

    2.7 閉包 Closure

    閉包 closure 是 Java 中沒有的,也是需要重點學習的,學好 closure 對理解 Android 中的 Gradle 會有莫大的幫助

  • 閉包 closure 的定義如下,其中 [closureParameters ->] 作為參數部分,是可以省略的
  • { [closureParameters -> ] statements } 復制代碼
  • closure 其實是 Groovy 中 groovy.lang.Closure 的一個類
  • 閉包 closure 可以訪問閉包之外的變量
  • 閉包 closure 可以有三種調用方式,如下代碼所示
  • 閉包 closure 的參數可以省略,默認是有個 it 參數的
  • 閉包 closure 也可以作為另一個閉包 closure 的參數
  • // 閉包可以訪問閉包之外的變量 def message = 'closure is good' def printMessage = {println "The message is '${message}'" }// 閉包實際上是一個 `groovy.lang.Closure` 類 Closure<Boolean> booleanClosure = {return it == 'xiaoming' }// 閉包可以省略參數,默認有一個 `it` 的參數 def testClosure = {println "I am a closure, the params is ${it}." }// 閉包可以有多個參數,參數可以指定類型,也可以不指定類型 def testClosureParams = { name, int age ->println "I am a closure, the params is ${name}." }// 閉包可以作為另一個閉包的參數 def paramsClosure = { name, closure ->if (closure(name)) {println 'The input name is xiaoming'} else {println 'The input name is not xiaoming'} }task helloClosure {doLast {printMessage()println booleanClosure('xiaoming')println booleanClosure('test')// 閉包的三種調用方式testClosure 'xiaoming'testClosure.call('xiaoming')testClosure('xiaoming')testClosureParams('xiaoming', 20)// 閉包 booleanClosure 作為閉包 paramsClosure 的參數paramsClosure('xiaoming', booleanClosure)paramsClosure('test', booleanClosure)// 可以在調用閉包的時候才去定義參數閉包的定義,使用非常方便簡潔paramsClosure('xiaoming', { name ->name.toUpperCase() == 'XIAOMING'})} } 復制代碼

    輸出如下所示

    > Task :app:helloClosure The message is 'closure is good' true false I am a closure, the params is xiaoming. I am a closure, the params is xiaoming. I am a closure, the params is xiaoming. I am a closure, the params is xiaoming. The input name is xiaoming The input name is not xiaoming The input name is xiaoming 復制代碼

    Groovy 的基礎知識就是這么多,如果想學習更多的內容,建議學習 Groovy 文檔

    總結

    以上是生活随笔為你收集整理的Gradle 之语言基础 Groovy的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。