Groovy動(dòng)態(tài)語言使用教程簡(jiǎn)介
Groovy 簡(jiǎn)介
Groovy 是構(gòu)建在 JVM 上的一個(gè)輕量級(jí)卻強(qiáng)大的動(dòng)態(tài)語言,它結(jié)合了 Python、Ruby 和 Smalltalk 的許多強(qiáng)大的特性。 Groovy 就是用 Java 寫的,Groovy 語法與 Java 語法類似,Groovy 代碼能夠與 Java 代碼很好地結(jié)合,也能用于擴(kuò)展現(xiàn)有代碼。相對(duì)于 Java,它在編寫代碼的靈活性上有非常明顯的提升,Groovy 可以使用其他 Java 語言編寫的庫。
Groovy 是增強(qiáng) Java 平臺(tái)的唯一的腳本語言。它提供了類似于 Java 的語法,內(nèi)置映射(Map)、列表(List)、方法、類、閉包(closure)以及生成器。腳本語言不會(huì)替代系統(tǒng)編程語言,兩者是相互補(bǔ)充的。
系統(tǒng)編程語言的目的:
- 開發(fā)復(fù)雜的算法或者數(shù)據(jù)結(jié)構(gòu)
- 實(shí)現(xiàn)計(jì)算密集型應(yīng)用
- 操作大型數(shù)據(jù)集
- 實(shí)現(xiàn)定義良好的、變更緩慢的需求
腳本語言應(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言。也就是說,Groovy 中每一個(gè)事物最終都會(huì)被當(dāng)做某些類的一個(gè)實(shí)例對(duì)象。
Groovy語法特性(相比于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í)語句方法調(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語法(閉包實(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)的原生語法,寫法更便捷
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)語言使用教程簡(jiǎn)介的詳細(xì)內(nèi)容,更多關(guān)于Groovy動(dòng)態(tài)語言的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Java8中接口的默認(rèn)方法和靜態(tài)方法
Java 8是Java語言的一個(gè)重要版本,其中引入了許多新特性和改進(jìn),其中一個(gè)值得關(guān)注的特性是接口的默認(rèn)方法和靜態(tài)方法,本文就來和大家簡(jiǎn)單講講吧2023-05-05
舉例講解Java的Jackson庫中ObjectMapper類的使用
這篇文章主要介紹了舉例講解Java的Jackson庫中ObjectMapper類的使用,Jackson庫通常被用來實(shí)現(xiàn)Java的對(duì)象和JSON之間的轉(zhuǎn)換功能,需要的朋友可以參考下2016-01-01
SpringBoot下RabbitMq實(shí)現(xiàn)定時(shí)任務(wù)
這篇文章主要為大家詳細(xì)介紹了SpringBoot下RabbitMq實(shí)現(xiàn)定時(shí)任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
使用Feign實(shí)現(xiàn)微服務(wù)間文件傳輸
這篇文章主要為大家詳細(xì)介紹了使用Feign實(shí)現(xiàn)微服務(wù)間文件傳輸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04
arthas在idea和docker中的應(yīng)用方式
這篇文章主要介紹了arthas在idea和docker中的應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-10-10
redis統(tǒng)計(jì)APP在線人數(shù)的實(shí)例
這篇文章主要介紹了redis統(tǒng)計(jì)APP在線人數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
SpringBoot?MongoCustomConversions自定義轉(zhuǎn)換方式
這篇文章主要介紹了SpringBoot?MongoCustomConversions自定義轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
java中的Timer和Timertask的關(guān)系解讀
本文詳細(xì)介紹了Java中的Timer和TimerTask類,包括它們之間的關(guān)系、API的使用方法、注意事項(xiàng)以及操作案例,Timer是一個(gè)調(diào)度器,而TimerTask是具體的任務(wù)類,Timer僅對(duì)應(yīng)一個(gè)線程,不保證任務(wù)執(zhí)行的精確性,但線程安全,一個(gè)Timer可以調(diào)度多個(gè)TimerTask2024-12-12
優(yōu)化Java虛擬機(jī)總結(jié)(jvm調(diào)優(yōu))
這篇文章主要介紹了優(yōu)化Java虛擬機(jī)總結(jié)(jvm調(diào)優(yōu)),具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01

