日韩性视频-久久久蜜桃-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的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 日韩精品无码一本二本三本色 | 97视频免费看 | 国产日韩欧美在线观看视频 | 国产一区二区三区精品视频 | 免费在线观看一区二区 | 亚洲AV无码成人国产精品色 | 精品一区二区三区免费视频 | 先锋资源在线视频 | 91九色蝌蚪 | 久久叉| 久久国产色 | 嫩草影院在线免费观看 | 亚洲人人爱 | 日本三区视频 | 一区成人 | 国产剧情在线 | 亚洲欧美视频在线观看 | 女人性做爰24姿势视频 | 久久久久久久国产精品美女 | 韩国美女福利视频 | 国产色秀 | 国产伦精品一区二区三区视频痴汉 | 欧美色涩在线第一页 | 伊人婷婷综合 | 五月天中文字幕在线 | 98国产视频| 国产午夜福利一区 | 小早川怜子一区二区三区 | 日韩一区二区三区在线观看视频 | 中文字幕av在线免费观看 | 黑丝一区二区三区 | 欧美精品五区 | 国产女人18水真多毛片18精品 | 日本a级片免费 | 免费在线观看的黄色网址 | 精品视频| 国产另类精品 | 久久国产一级片 | 国产a毛片 | 毛片一级片 | 色老头在线观看 | 先锋影音制服丝袜 | 人人人妻人人澡人人爽欧美一区 | 国产精品国产三级国产三级人妇 | 日韩精品乱码久久久久久 | 久久国产一级片 | 激情综合网激情 | 朝桐光一区二区三区 | 日本一本二本三区免费 | 在线观看视频99 | 香蕉精品在线 | 伊人久久青青草 | www.777奇米影视 | 日日噜夜夜噜 | 日韩全黄 | 日韩美女视频一区 | 国产夜色视频 | 久久一久久 | 亚洲乱码国产乱码精品精的特点 | 国产精品欧美大片 | 日本天堂在线视频 | 成人免费无遮挡无码黄漫视频 | 天堂av亚洲av国产av电影 | 999av| 蜜桃视频色 | 久久嫩| 一级做a爱片久久 | 香蕉久久网站 | 欧美日韩在线视频观看 | 热99| 久久99精品国产91久久来源 | www.成人av | 一区免费 | 欧美30p| 国产91热爆ts人妖在线 | 亚洲一区二区三区中文字幕 | 国产色啪 | 亚洲大尺度在线 | 久久精品在线观看 | 风间由美在线观看 | 日本一区二区三区视频在线播放 | 国产又粗又猛又黄视频 | 国产精品亚洲一区二区三区 | 亚洲美女av在线 | 成年人在线免费观看视频网站 | 成人免费黄色大片 | 97超碰在线播放 | 天天色宗合| 亚洲国产情侣 | 亚洲图片视频小说 | 欧美午夜精品久久久久久孕妇 | 91av久久久| 性色AV无码久久一区二区三 | 色多多在线视频 | 亚洲乱仑 | 伊人网在线观看 | 欧性猛交ⅹxxx乱大交 | 日本加勒比一区 | 青草视频在线播放 |