Groovy動(dòng)態(tài)語(yǔ)言使用教程簡(jiǎn)介
Groovy 簡(jiǎn)介
Groovy 是構(gòu)建在 JVM 上的一個(gè)輕量級(jí)卻強(qiáng)大的動(dòng)態(tài)語(yǔ)言,它結(jié)合了 Python、Ruby 和 Smalltalk 的許多強(qiáng)大的特性。 Groovy 就是用 Java 寫的,Groovy 語(yǔ)法與 Java 語(yǔ)法類似,Groovy 代碼能夠與 Java 代碼很好地結(jié)合,也能用于擴(kuò)展現(xiàn)有代碼。相對(duì)于 Java,它在編寫代碼的靈活性上有非常明顯的提升,Groovy 可以使用其他 Java 語(yǔ)言編寫的庫(kù)。
Groovy 是增強(qiáng) Java 平臺(tái)的唯一的腳本語(yǔ)言。它提供了類似于 Java 的語(yǔ)法,內(nèi)置映射(Map)、列表(List)、方法、類、閉包(closure)以及生成器。腳本語(yǔ)言不會(huì)替代系統(tǒng)編程語(yǔ)言,兩者是相互補(bǔ)充的。
系統(tǒng)編程語(yǔ)言的目的:
- 開發(fā)復(fù)雜的算法或者數(shù)據(jù)結(jié)構(gòu)
- 實(shí)現(xiàn)計(jì)算密集型應(yīng)用
- 操作大型數(shù)據(jù)集
- 實(shí)現(xiàn)定義良好的、變更緩慢的需求
腳本語(yǔ)言應(yīng)用的目的:
- 連接已有的組件
- 處理經(jīng)常變化的多種類型的實(shí)體
- 具有圖形化用戶界面
- 擁有快速變化的功能
Groovy 應(yīng)用
大名鼎鼎的 Gradle,背后是 Groovy。Spring 的未來越來越多的使用 Groovy,甚至在用 Jira 跟蹤項(xiàng)目時(shí),背后也有 Groovy。實(shí)際上,就應(yīng)用場(chǎng)景而言,Java 開發(fā)已經(jīng)有越來越多的 Groovy 出現(xiàn)在后臺(tái)了。而對(duì)于一般的應(yīng)用開發(fā),只要能用 Java 就都能用到 Groovy,唯一的難點(diǎn)只在于能不能招到足夠的人員。
Groovy 與 Java
Java 編譯器會(huì)產(chǎn)生可以在 Java 虛擬機(jī)上運(yùn)行的字節(jié)碼。Groovy 類和 Java 是二進(jìn)制兼容的。Groovy 編譯器產(chǎn)生的字節(jié)碼與 Java 編譯器產(chǎn)生的字節(jié)碼是完全一樣的。對(duì)于 JVM 而言,Groovy 和 Java 是完全一樣的。因此,Groovy 能夠完全使用各種 Java API。Groovy 是一門面向?qū)ο蟮恼Z(yǔ)言。也就是說,Groovy 中每一個(gè)事物最終都會(huì)被當(dāng)做某些類的一個(gè)實(shí)例對(duì)象。
Groovy語(yǔ)法特性(相比于Java)
Groovy 編譯器產(chǎn)生的字節(jié)碼與 Java 編譯器產(chǎn)生的字節(jié)碼是完全一樣的。對(duì)于 JVM 而言,Groovy 和 Java 是完全一樣的。因此,Groovy 能夠完全使用各種 Java API。
- 不需要分號(hào)
- return 關(guān)鍵字可省略,方法的最后一句表達(dá)式可作為返回值返回 (視具體情況使用, 避免降低可讀性)
- 類的默認(rèn)作用域是public,不需要getter/setter方法
- def 關(guān)鍵字定義的變量類型都是Object,任何變量、方法都能用def定義/聲明,在 Groovy 中一切都是對(duì)象
- 導(dǎo)航操作符 ( ?. )可幫助實(shí)現(xiàn)對(duì)象引用不為空時(shí)方法才會(huì)被調(diào)用
// java if (object != null) { object.getFieldA(); } // groovy object?.getFieldA()
強(qiáng)大命令鏈功能。Groovy 可以使你省略頂級(jí)語(yǔ)句方法調(diào)用中參數(shù)外面的括號(hào)。命令鏈功能則將這種特性繼續(xù)擴(kuò)展,它可以將不需要括號(hào)的方法調(diào)用串接成鏈,既不需要參數(shù)周圍的括號(hào),鏈接的調(diào)用之間也不需要點(diǎn)號(hào)
def methodA(String name) { println("A: " + name) return this } def methodB(String name) { println("B: " + name) return this } def methodC() { println("C") return this } def methodD(String name) { println("D: " + name) return this } methodA("張三") methodB("李四") methodC() methodD("王五") // 不帶參數(shù)的鏈中需要用括號(hào) methodA "張三" methodB "李四" methodC() methodD "王五"
閉包。閉包是一個(gè)短的匿名代碼塊。每個(gè)閉包會(huì)被編譯成繼承 groovy.lang.Closure 類的子類,這個(gè)類有一個(gè)叫 call 方法,通過該方法可以傳遞參數(shù)并調(diào)用這個(gè)閉包。
def hello = {println "Hello World"} hello.call() // 包含形式參數(shù) def hi = { person1, person2 -> println "hi " + person1 + ", "+ person2 } hi.call("張三", "李四") // 隱式單個(gè)參數(shù), 'it'是Groovy中的關(guān)鍵字 def hello = { println("hello, " + it) } hello.call("王五")
with語(yǔ)法(閉包實(shí)現(xiàn))
// Java public class JavaDeamo { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MONTH, Calendar.DECEMBER); calendar.set(Calendar.DATE, 4); calendar.set(Calendar.YEAR, 2018); Date time = calendar.getTime(); System.out.println(time); } } // Groovy Calendar calendar = Calendar.getInstance() calendar.with { // it 指 calendar 這個(gè)引用 it.set(Calendar.MONTH, Calendar.DECEMBER) // 可以省略it, 使用命令鏈 set Calendar.DATE, 4 set Calendar.YEAR, 2018 // calendar.getTime() println(getTime()) // 省略get, 對(duì)于get開頭的方法名并且 println(time) }
數(shù)據(jù)結(jié)構(gòu)的原生語(yǔ)法,寫法更便捷
def list = [11, 12, 13, 14] // 列表, 默認(rèn)是ArrayList def list = ['Angular', 'Groovy', 'Java'] as List // 字符串列表 // 同list.add(8) list << 8 [1, 2, [3, 4], 5] // 嵌套列表 ['Groovy', 21, 2.11] // 異構(gòu)的對(duì)象引用列表 [] // 一個(gè)空列表 def set = ["22", "11", "22"] as Set // LinkedHashSet, as運(yùn)算符轉(zhuǎn)換類型 def map = ['TopicName': 'Lists', 'TopicName': 'Maps'] // map, LinkedHashMap [:] // 空map // 循環(huán) map.each { print it.key }
以上就是Groovy動(dòng)態(tài)語(yǔ)言使用教程簡(jiǎn)介的詳細(xì)內(nèi)容,更多關(guān)于Groovy動(dòng)態(tài)語(yǔ)言的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
動(dòng)態(tài)代理模擬實(shí)現(xiàn)aop的示例
下面小編就為大家?guī)硪黄獎(jiǎng)討B(tài)代理模擬實(shí)現(xiàn)aop的示例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望對(duì)大家有所幫助2017-11-11Spring HttpMessageConverter的作用及替換解析
這篇文章主要介紹了Spring HttpMessageConverter的作用及替換解析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02JVM分配和回收堆外內(nèi)存的方式與注意點(diǎn)
JVM啟動(dòng)時(shí)分配的內(nèi)存稱為堆內(nèi)存,與之相對(duì)的,在代碼中還可以使用堆外內(nèi)存,比如Netty,廣泛使用了堆外內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于JVM分配和回收堆外內(nèi)存的方式與注意點(diǎn),需要的朋友可以參考下2022-07-07tk.mybatis通用插件updateByPrimaryKeySelective無法自動(dòng)更新列的解決辦法
tk.mybatis是一個(gè)很好用的通用插件,本文主要介紹了tk.mybatis通用插件updateByPrimaryKeySelective無法自動(dòng)更新列的解決辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12基于Java?利用Mybatis實(shí)現(xiàn)oracle批量插入及分頁(yè)查詢
這篇文章主要介紹了基于Java?利用Mybatis實(shí)現(xiàn)oracle批量插入及分頁(yè)查詢,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下2022-07-07Java?Hibernate中一對(duì)多和多對(duì)多關(guān)系的映射方式
Hibernate是一種Java對(duì)象關(guān)系映射框架,支持一對(duì)多和多對(duì)多關(guān)系的映射。一對(duì)多關(guān)系可以使用集合屬性和單向/雙向關(guān)聯(lián)來映射,多對(duì)多關(guān)系可以使用集合屬性和中間表來映射。在映射過程中,需要注意級(jí)聯(lián)操作、延遲加載、中間表的處理等問題2023-04-04