Groovy 語(yǔ)法-表達(dá)式知識(shí)學(xué)習(xí)
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)。
表達(dá)式是Groovy程序的構(gòu)建塊,用于引用現(xiàn)有值并執(zhí)行代碼以創(chuàng)建新值。
2. 表達(dá)式
Groovy支持許多與Java相同的表達(dá)式,如下:
表達(dá)式示例 | 描述 |
? | 變量、字段、參數(shù)的名稱… |
? | 特殊名字 |
? | 值 |
? | 類(lèi)名稱值 |
? | 帶括號(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á)式示例 | 描述 |
? | 縮寫(xiě)類(lèi)文字(當(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的作用類(lèi)似。GPath?通常用于處理XML,但它確實(shí)適用于任何對(duì)象圖。在XPath使用類(lèi)似文件系統(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屬性。類(lèi)似于:a.getB().getC()。
在這兩種情況下,GPath?表達(dá)式都可以視為對(duì)象圖上的查詢。對(duì)于POJO,對(duì)象圖通常由通過(guò)對(duì)象實(shí)例化和組合編寫(xiě)的程序構(gòu)建;對(duì)于XML處理,對(duì)象圖是解析XML文本的結(jié)果,通常使用XmlParser或XmlSlurper等類(lèi)。有關(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"]? :類(lèi)映射表示法,所有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è)類(lèi)的非靜態(tài)方法中,該類(lèi)具有另一個(gè)名為aMethodFoo的方法:
以下GPath表達(dá)式將獲取該方法的名稱:
更準(zhǔn)確地說(shuō),上面的GPath表達(dá)式生成了一個(gè)字符串列表,每個(gè)字符串都是此上現(xiàn)有方法的名稱,其中該名稱以Foo結(jié)尾。
現(xiàn)在,假如Foo類(lèi)中還有以下的幾個(gè)方法:
則以下GPath?表達(dá)式將獲得aMethodBar? 和aSecondMethodBar 方法名稱
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表示如下:
在存在集合的GPath表達(dá)式中也可以使用數(shù)組訪問(wèn)表示法:
PS: 1.grep()方法是一個(gè)正則表達(dá)式方法,用于查找字符串,方法中的傳參是正則匹配哦。
2.在GPath表達(dá)式中,數(shù)組訪問(wèn)從零開(kāi)始。
2.4 GPath的XML導(dǎo)航
下面是一個(gè)XML文檔和各種形式的GPath表達(dá)式的示例:
定義了一個(gè)xmlText變量,它的參數(shù)內(nèi)容是一個(gè)xml。下面,通過(guò)GPath導(dǎo)航配置進(jìn)行相關(guān)內(nèi)容的讀?。?/p>
3. 小結(jié)
本篇主要介紹了一下Groovy的表達(dá)式的定義和GPath表達(dá)式的簡(jiǎn)單定義。其中GPath是java中沒(méi)有的寫(xiě)法。可以支持多級(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è)贊謝謝。