Android Gradle(三)Groovy快速入门指南
本文首發于微信公眾號「劉望舒」
原文鏈接:Groovy快速入門看這篇就夠了
前言
在前面我們學習了為什么現在要用Gradle?和Gradle入門前奏兩篇文章,對Gradle也有了大概的了解,這篇文章我們接著來學習Groovy的基礎,要想學好Gradle,Groovy是必須要掌握的。Groovy僅憑一篇文章是介紹不完的,這里會帶大家快速的入門Groovy,講解Groovy和Java不同的部分,想要更多了解Groovy可以查看Groovy官方文檔和Groovy API文檔。
1.Groovy概述
Groovy是Apache 旗下的一種基于JVM的面向對象編程語言,既可以用于面向對象編程,也可以用作純粹的腳本語言。在語言的設計上它吸納了Python、Ruby 和 Smalltalk 語言的優秀特性,比如動態類型轉換、閉包和元編程支持。 Groovy與 Java可以很好的互相調用并結合編程 ,比如在寫 Groovy 的時候忘記了語法可以直接按Java的語法繼續寫,也可以在 Java 中調用 Groovy 腳本。比起Java,Groovy語法更加的靈活和簡潔,可以用更少的代碼來實現Java實現的同樣功能。
2.Groovy編寫和調試
Groovy的代碼可以在Android Studio和IntelliJ IDEA等IDE中進行編寫和調試,缺點是需要配置環境,這里推薦在文本中編寫代碼并結合命令行進行調試(文本推薦使用Sublime Text)。關于命令行請查看Android Gradle(二)Gradle入門前奏這篇文章。 具體的操作步驟就是:在一個目錄中新建build.gradle文件,在build.gradle中新建一個task,在task中編寫Groovy代碼,用命令行進入這個build.gradle文件所在的目錄,運行gradle task名稱 等命令行對代碼進行調試,本文中的例子都是這樣編寫和調試的。
3.變量
Groovy中用def關鍵字來定義變量,可以不指定變量的類型,默認訪問修飾符是public。
def a = 1; def int b = 1; def c = "hello world"; 復制代碼4.方法
方法使用返回類型或def關鍵字定義,方法可以接收任意數量的參數,這些參數可以不申明類型,如果不提供可見性修飾符,則該方法為public。 用def關鍵字定義方法。
task method <<{add (1,2)minus 1,2 //1 } def add(int a,int b) { println a+b //3 } def minus(a,b) {//2 println a-b } 復制代碼如果指定了方法返回類型,可以不需要def關鍵字來定義方法。
task method <<{def number=minus 1,2println number } int minus(a,b) { return a-b } 復制代碼如果不使用return ,方法的返回值為最后一行代碼的執行結果。
int minus(a,b) { a-b //4 } 復制代碼從上面兩段代碼中可以發現Groovy中有很多省略的地方:
5.類
Groovy類非常類似于Java類。
task method <<{def p = new Person()p.increaseAge 5println p.age } class Person { String name Integer age =10def increaseAge(Integer years) { this.age += years} } 復制代碼運行 gradle method打印結果為: 15
Groovy類與Java類有以下的區別:
6.語句
6.1 斷言
Groovy斷言和Java斷言不同,它一直處于開啟狀態,是進行單元測試的首選方式。
task method <<{assert 1+2 == 6 } 復制代碼輸出結果為:
Execution failed for task ':method'. > assert 1+2 == 6| |3 false 復制代碼當斷言的條件為false時,程序會拋出異常,不再執行下面的代碼,從輸出可以很清晰的看到發生錯誤的地方。
6.2 for循環
Groovy支持Java的for(int i=0;i<N;i++)和for(int i :array)形式的循環語句,另外還支持for in loop形式,支持遍歷范圍、列表、Map、數組和字符串等多種類型。
//遍歷范圍 def x = 0 for ( i in 0..3 ) {x += i } assert x == 6 //遍歷列表 def x = 0 for ( i in [0, 1, 2, 3] ) {x += i } assert x == 6 //遍歷Map中的值 def map = ['a':1, 'b':2, 'c':3] x = 0 for ( v in map.values() ) {x += v } assert x == 6 復制代碼6.3 switch語句
Groovy中的Switch語句不僅兼容Java代碼,還可以處理更多類型的case表達式。
task method <<{ def x = 16 def result = ""switch ( x ) {case "ok":result = "found ok"case [1, 2, 4, 'list']:result = "list"breakcase 10..19:result = "range"breakcase Integer:result = "integer"breakdefault:result = "default" } assert result == "range" } 復制代碼case表達式可以是字符串、列表、范圍、Integer等等,因為篇幅原因,這里只列出了一小部分。
7. 數據類型
Groovy中的數據類型主要有以下幾種:
- Java中的基本數據類型
- Groovy中的容器類
- 閉包
7.1 字符串
Groovy中的基本數據類型和Java大同小異,這里主要介紹下字符串類型。在Groovy種有兩種字符串類型,普通字符串String(java.lang.String)和插值字符串GString(groovy.lang.GString)。
單引號字符串 在Groovy中單引號字符串和雙引號字符串都可以定義一個字符串常量,只不過單引號字符串不支持插值。
'Android進階解密' 復制代碼雙引號字符串 要想插值可以使用雙引號字符串,插值指的是替換字符串中的占位符,占位符表達式為${}或者以$為前綴。
def name = 'Android進階之光' println "hello ${name}" println "hello $name" 復制代碼三引號字符串 三引號字符串可以保留文本的換行和縮進格式,不支持插值。
task method <<{ def name = '''Android進階之光Android進階解密 Android進階?''' println name } 復制代碼打印結果為:
Android進階之光Android進階解密 Android進階? 復制代碼GString String是不可變的,GString卻是可變的,GString和String即使有相同的字面量,它們的hashCodes的值也可能不同,因此應該避免使用使用GString作為Map的key。
assert "one: ${1}".hashCode() != "one: 1".hashCode() 復制代碼當雙引號字符串中包含插值表達式時,字符串類型為GString,因此上面的斷言為true。
7.2 List
Groovy沒有定義自己的集合類,它在Java集合類的基礎上進行了增強和簡化。Groovy的List對應Java中的List接口,默認的實現類為Java中的ArrayList。
def number = [1, 2, 3] assert number instanceof List def linkedList = [1, 2, 3] as LinkedList assert linkedList instanceof java.util.LinkedList 復制代碼可以使用as操作符來顯式指定List的實現類為java.util.LinkedList。 獲取元素同樣要比Java要簡潔些,使用[]來獲取List中具有正索引或負索引的元素。
task method <<{ def number = [1, 2, 3, 4] assert number [1] == 2 assert number [-1] == 4 //1 number << 5 //2 assert number [4] == 5 assert number [-1] == 5 } 復制代碼注釋1處的索引-1是列表末尾的第一個元素。注釋2處使用<<運算符在列表末尾追加一個元素。
7.3 Map
創建Map同樣使用[],需要同時指定鍵和值,默認的實現類為java.util.LinkedHashMap。
def name = [one: '魏無羨', two: '楊影楓', three: '張無忌'] assert name['one'] == '魏無羨' assert name.two == '楊影楓' 復制代碼Map還有一個鍵關聯的問題:
def key = 'name' def person = [key: '魏無羨'] //1 assert person.containsKey('key') person = [(key): '魏無羨'] //2 assert person.containsKey('name') 復制代碼注釋1處魏無羨的鍵值是key這個字符串,而不是key變量的值 name。如果想要以key變量的值為鍵值,需要像注釋2處一樣使用(key),用來告訴解析器我們傳遞的是一個變量,而不是定義一個字符串鍵值。
7.4 閉包(Closure)
Groovy中的閉包是一個開放的、匿名的、可以接受參數和返回值的代碼塊。 定義閉包 閉包的定義遵循以下語法:
{ [closureParameters -> ] statements } 復制代碼閉包分為兩個部分,分別是參數列表部分[closureParameters -> ]和語句部分 statements 。 參數列表部分是可選的,如果閉包只有一個參數,參數名是可選的,Groovy會隱式指定it作為參數名,如下所示。
{ println it } //使用隱式參數it的閉包 復制代碼當需要指定參數列表時,需要->將參數列表和閉包體相分離。
{ it -> println it } //it是一個顯示參數 { String a, String b -> println "${a} is a ${b}" } 復制代碼閉包是groovy.lang.Cloush類的一個實例,這使得閉包可以賦值給變量或字段,如下所示。
//將閉包賦值給一個變量 def println ={ it -> println it } assert println instanceof Closure //將閉包賦值給Closure類型變量 Closure do= { println 'do!' } 復制代碼調用閉包 閉包既可以當做方法來調用,也可以顯示調用call方法。
def code = { 123 } assert code() == 123 //閉包當做方法調用 assert code.call() == 123 //顯示調用call方法 def isOddNumber = { int i -> i%2 != 0 } assert isOddNumber(3) == true //調用帶參數的閉包 復制代碼8. I/O 操作
Groovy的 I/O 操作要比Java的更為的簡潔。
8.1 文件讀取
我們可以在PC上新建一個name.txt,在里面輸入一些內容,然后用Groovy來讀取該文件的內容:
def filePath = "D:/Android/name.txt" def file = new File(filePath) ; file.eachLine {println it } 復制代碼可以看出Groovy的文件讀取是很簡潔的,還可以更簡潔些:
def filePath = "D:/Android/name.txt" def file = new File(filePath) ; println file.text 復制代碼8.2 文件寫入
文件寫入同樣十分簡潔:
def filePath = "D:/Android/name.txt" def file = new File(filePath);file.withPrintWriter {it.println("三井壽")it.println("仙道彰") } 復制代碼9. 其他
9.1 asType
asType可以用于數據類型轉換:
String a = '23' int b = a as int def c = a.asType(Integer) assert c instanceof java.lang.Integer 復制代碼9.2 判斷是否為真
if (name != null && name.length > 0) {} 復制代碼可以替換為
if (name) {} 復制代碼9.3 安全取值
在Java中,要安全獲取某個對象的值可能需要大量的if語句來判空:
if (school != null) {if (school.getStudent() != null) {if (school.getStudent().getName() != null) {System.out.println(school.getStudent().getName());}} } 復制代碼Groovy中可以使用?.來安全的取值:
println school?.student?.name 復制代碼9.4 with操作符
對同一個對象的屬性進行賦值時,可以這么做:
task method <<{ Person p = new Person() p.name = "楊影楓" p.age = 19 p.sex = "男" println p.name } class Person { String name Integer ageString sex } 復制代碼使用with來進行簡化:
Person p = new Person() p.with {name = "楊影楓"age= 19sex= "男"} println p.name 復制代碼10.總結
本文大概的介紹了Groovy的一些語法,包括:變量、方法、數據類型等等,比起Groovy 官方文檔來說,介紹的并不多,但不要忘了本系列的目標是學習與Android相關的Gradle,Groovy并不是重點,我們只需要了解本文所介紹的內容就夠了,如果碰到哪里不會再去查找Groovy 官方文檔和Groovy API文檔。
感謝
www.groovy-lang.org/single-page… blog.csdn.net/u011054333/…
blog.csdn.net/yanical/art…
blog.csdn.net/zhaoyanjun6…
blog.csdn.net/singwhatiwa…
www.cnblogs.com/zqlxtt/p/57…
blog.csdn.net/u014099894/…
www.jianshu.com/p/ba55dc163…
分享Android、Java和大前端相關技術
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Android Gradle(三)Groovy快速入门指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker和docker-compos
- 下一篇: Elasticsearch-映射