新聞中心
1. 介紹
本篇內(nèi)容為Groovy學(xué)習(xí)筆記第31篇。繼續(xù)學(xué)習(xí)語(yǔ)法相關(guān)的知識(shí)點(diǎn)。本篇的重點(diǎn)是Expressions(表達(dá)式)的相關(guān)知識(shí)點(diǎn)。

創(chuàng)新互聯(lián)主要從事網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)東麗,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):028-86922220
表達(dá)式是Groovy程序的構(gòu)建塊,用于引用現(xiàn)有值并執(zhí)行代碼以創(chuàng)建新值。
2. 表達(dá)式
Groovy支持許多與Java相同的表達(dá)式,如下:
|
表達(dá)式示例 |
描述 |
|
? |
變量、字段、參數(shù)的名稱… |
|
? |
特殊名字 |
|
? |
值 |
|
? |
類名稱值 |
|
? |
帶括號(hào)的表達(dá)式 |
|
? |
一元運(yùn)算符表達(dá)式 |
|
? |
二進(jìn)制運(yùn)算符表達(dá)式 |
|
? |
三元運(yùn)算符表達(dá)式 |
|
? |
Lambda表達(dá)式 |
|
? |
switch表達(dá)式 |
上面的表達(dá)式形式是java也支持的表達(dá)式。而Groovy也有一些自己獨(dú)有的表達(dá)式:
|
表達(dá)式示例 |
描述 |
|
? |
縮寫類文字(當(dāng)不明確時(shí)) |
|
? |
閉包表達(dá)式 |
|
? |
文字列表(List)表達(dá)式 |
|
? |
文字映射(Map)表達(dá)式 |
Groovy還擴(kuò)展了Java中用于成員訪問(wèn)的普通點(diǎn)表示法。Groovy通過(guò)指定某些感興趣數(shù)據(jù)的層次結(jié)構(gòu)中的路徑,為訪問(wèn)分層數(shù)據(jù)結(jié)構(gòu)提供了特殊支持。這些Groovy路徑表達(dá)式稱為GPath表達(dá)式。
2.1 GPath 表達(dá)式
GPath?是一種集成到Groovy中的路徑表達(dá)式語(yǔ)言,它允許識(shí)別部分嵌套的結(jié)構(gòu)化數(shù)據(jù)。從這個(gè)意義上講,它的目標(biāo)和范圍與XPath對(duì)XML的作用類似。GPath?通常用于處理XML,但它確實(shí)適用于任何對(duì)象圖。在XPath使用類似文件系統(tǒng)的路徑表示法(部分由斜線/?分隔的樹(shù)層次結(jié)構(gòu))的情況下,GPath使用點(diǎn)對(duì)象表示法來(lái)執(zhí)行對(duì)象導(dǎo)航。
例如,可以指定感興趣對(duì)象或元素的路徑:
- a.b.c : 在xml中可以表示,在a中生成b中的所有c元素。
- a.b.c? : 在POJOS對(duì)象中可以表示,為a的所有b屬性生成c屬性。類似于:a.getB().getC()。
在這兩種情況下,GPath?表達(dá)式都可以視為對(duì)象圖上的查詢。對(duì)于POJO,對(duì)象圖通常由通過(guò)對(duì)象實(shí)例化和組合編寫的程序構(gòu)建;對(duì)于XML處理,對(duì)象圖是解析XML文本的結(jié)果,通常使用XmlParser或XmlSlurper等類。有關(guān)在Groovy中使用XML的更多詳細(xì)信息,請(qǐng)參閱處理XML。
PS:這里就不詳細(xì)介紹如何處理XML文件了。如果想了解XML文件的處理可以閱讀:http://docs.groovy-lang.org/docs/groovy-4.0.6/html/documentation/#processing-xml。如果不想閱讀該英文文檔,可以等待我后續(xù)的相關(guān)介紹
當(dāng)查詢從XmlParser或XmlSlurper生成的對(duì)象圖時(shí),GPath表達(dá)式可以引用在元素上使用@符號(hào)定義的屬性:
- a["@href"]? :類映射表示法,所有a元素的href屬性。
- a.'@href':屬性表示法:表示這一點(diǎn)的另一種方法。
- a.@href:直接表示法:另一種表達(dá)方式
PS:后面學(xué)習(xí)XML解析的時(shí)候?qū)?huì)詳細(xì)介紹。這里簡(jiǎn)單說(shuō)明一下。
2.2 對(duì)象導(dǎo)航
讓我們看一個(gè)簡(jiǎn)單對(duì)象圖上GPath?表達(dá)式的示例,即使用java反射獲得的表達(dá)式。假設(shè)您在一個(gè)類的非靜態(tài)方法中,該類具有另一個(gè)名為aMethodFoo的方法:
void aMethodFoo() { println "This is aMethodFoo." }以下GPath表達(dá)式將獲取該方法的名稱:
assert ['aMethodFoo'] == this.class.methods.name.grep(~/.*Foo/)
更準(zhǔn)確地說(shuō),上面的GPath表達(dá)式生成了一個(gè)字符串列表,每個(gè)字符串都是此上現(xiàn)有方法的名稱,其中該名稱以Foo結(jié)尾。
現(xiàn)在,假如Foo類中還有以下的幾個(gè)方法:
void aMethodBar() { println "This is aMethodBar." }
void anotherFooMethod() { println "This is anotherFooMethod." }
void aSecondMethodBar() { println "This is aSecondMethodBar." }則以下GPath?表達(dá)式將獲得aMethodBar? 和aSecondMethodBar 方法名稱
assert ['aMethodBar', 'aSecondMethodBar'] as Set == this.class.methods.name.grep(~/.*Bar/) as Set
2.3 解構(gòu)表達(dá)式
我們可以分解表達(dá)式this.class.methods.name.grep(~/.*Bar/)?來(lái)了解如何計(jì)算GPath:
- this.class?:屬性訪問(wèn)器,在這里等效于java中的this.getClass()方法,生成一個(gè)Class對(duì)象。
- this.class.methods?:屬性訪問(wèn)器,相當(dāng)于this.getClass().getMethods()?生成一個(gè)Method對(duì)象數(shù)組。
- this.class.methods.name?:對(duì)Method數(shù)組的每個(gè)元素應(yīng)用屬性訪問(wèn)器,并生成結(jié)果列表。
- this.class.methods.name.grep(...)?:對(duì)this.class.methods?生成的列表的每個(gè)元素調(diào)用方法grep并生成結(jié)果列表。
GPath?表達(dá)式的一個(gè)強(qiáng)大特性是,集合的屬性訪問(wèn)被轉(zhuǎn)換為集合中每個(gè)元素的屬性訪問(wèn),結(jié)果被收集到集合中。因此,表達(dá)式this.class.methods.name可以用Java表示如下:
ListmethodNames = new ArrayList ();
for (Method method : this.getClass().getMethods()) {
methodNames.add(method.getName());
}
return methodNames;
在存在集合的GPath表達(dá)式中也可以使用數(shù)組訪問(wèn)表示法:
assert 'aSecondMethodBar' == this.class.methods.name.grep(~/.*Bar/).sort()[1]
PS: 1.grep()方法是一個(gè)正則表達(dá)式方法,用于查找字符串,方法中的傳參是正則匹配哦。
2.在GPath表達(dá)式中,數(shù)組訪問(wèn)從零開(kāi)始。
2.4 GPath的XML導(dǎo)航
下面是一個(gè)XML文檔和各種形式的GPath表達(dá)式的示例:
def xmlText = """
|
|
|
|
|mykey
|value 123
|
|
|
|
|anotherKey
|42
|
|
|mykey
|fizzbuzz
|
|
|
|
"""
定義了一個(gè)xmlText變量,它的參數(shù)內(nèi)容是一個(gè)xml。下面,通過(guò)GPath導(dǎo)航配置進(jìn)行相關(guān)內(nèi)容的讀?。?/p>
def root = new XmlSlurper().parseText(xmlText.stripMargin())
println(root.level.size()) //輸出: 1 因?yàn)閞oot下只有一個(gè)level
println(root.level.sublevel.size) //輸出:2 因?yàn)閘evel下面有兩個(gè)sublevel
println(root.level.sublevel.findAll { it.@id == 1 }.size())//查找sublevel下id值為1的。 輸出:1
println(root.level.sublevel[0].keyVal[0].ket.text()) //輸出:mykey
3. 小結(jié)
本篇主要介紹了一下Groovy的表達(dá)式的定義和GPath表達(dá)式的簡(jiǎn)單定義。其中GPath是java中沒(méi)有的寫法??梢灾С侄嗉?jí)對(duì)象結(jié)構(gòu),也可以用于Json,XMl的解析中來(lái)。
以上相關(guān)內(nèi)容可以參考Groovy官方文檔:Groovy Language Documentation (groovy-lang.org)
下一篇繼續(xù)學(xué)習(xí)語(yǔ)法的相關(guān)知識(shí)。如果覺(jué)得總結(jié)的還行希望能夠點(diǎn)個(gè)贊謝謝。
文章題目:Groovy語(yǔ)法-表達(dá)式知識(shí)學(xué)習(xí)
文章URL:http://m.fisionsoft.com.cn/article/dpcsipc.html


咨詢
建站咨詢
