日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
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)。

創(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ù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):028-86922220

表達(dá)式是Groovy程序的構(gòu)建塊,用于引用現(xiàn)有值并執(zhí)行代碼以創(chuàng)建新值。

2. 表達(dá)式

Groovy支持許多與Java相同的表達(dá)式,如下:

表達(dá)式示例

描述

??foo??

變量、字段、參數(shù)的名稱(chēng)…

??this???, ??super???, ??it??

特殊名字

??true???, ??10???, ??"bar"??

??String.class??

類(lèi)名稱(chēng)值

??(?? expression ??)??

帶括號(hào)的表達(dá)式

??foo++???, ??~bar??

一元運(yùn)算符表達(dá)式

??foo + bar???, ??bar * baz??

二進(jìn)制運(yùn)算符表達(dá)式

??foo ? bar : baz??

三元運(yùn)算符表達(dá)式

??(Integer x, Integer y) → x + y??

Lambda表達(dá)式

??assert 'bar' == switch('foo') { case 'foo' -> 'bar' }??

switch表達(dá)式

上面的表達(dá)式形式是java也支持的表達(dá)式。而Groovy也有一些自己獨(dú)有的表達(dá)式:

表達(dá)式示例

描述

??String??

縮寫(xiě)類(lèi)文字(當(dāng)不明確時(shí))

??{ x, y → x + y }??

閉包表達(dá)式

??[1, 3, 5]??

文字列表(List)表達(dá)式

??[a:2, b:4, c:6]??

文字映射(Map)表達(dá)式

Groovy還擴(kuò)展了Java中用于成員訪(fǎng)問(wèn)的普通點(diǎn)表示法。Groovy通過(guò)指定某些感興趣數(shù)據(jù)的層次結(jié)構(gòu)中的路徑,為訪(fǎng)問(wèn)分層數(shù)據(jù)結(jié)構(gòu)提供了特殊支持。這些Groovy路徑表達(dá)式稱(chēng)為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)的路徑表示法(部分由斜線(xiàn)/?分隔的樹(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ì)象圖上的查詢(xún)。對(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)查詢(xún)從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的方法:

void aMethodFoo() { println "This is aMethodFoo." }

以下GPath表達(dá)式將獲取該方法的名稱(chēng):

assert ['aMethodFoo'] == this.class.methods.name.grep(~/.*Foo/)

更準(zhǔn)確地說(shuō),上面的GPath表達(dá)式生成了一個(gè)字符串列表,每個(gè)字符串都是此上現(xiàn)有方法的名稱(chēng),其中該名稱(chēng)以Foo結(jié)尾。

現(xiàn)在,假如Foo類(lèi)中還有以下的幾個(gè)方法:

void aMethodBar() { println "This is aMethodBar." }
void anotherFooMethod() { println "This is anotherFooMethod." }
void aSecondMethodBar() { println "This is aSecondMethodBar." }

則以下GPath?表達(dá)式將獲得aMethodBar? 和aSecondMethodBar 方法名稱(chēng)

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?:屬性訪(fǎng)問(wèn)器,在這里等效于java中的this.getClass()方法,生成一個(gè)Class對(duì)象。
  • this.class.methods?:屬性訪(fǎng)問(wèn)器,相當(dāng)于this.getClass().getMethods()?生成一個(gè)Method對(duì)象數(shù)組。
  • this.class.methods.name?:對(duì)Method數(shù)組的每個(gè)元素應(yīng)用屬性訪(fǎng)問(wèn)器,并生成結(jié)果列表。
  • this.class.methods.name.grep(...)?:對(duì)this.class.methods?生成的列表的每個(gè)元素調(diào)用方法grep并生成結(jié)果列表。

GPath?表達(dá)式的一個(gè)強(qiáng)大特性是,集合的屬性訪(fǎng)問(wèn)被轉(zhuǎn)換為集合中每個(gè)元素的屬性訪(fǎng)問(wèn),結(jié)果被收集到集合中。因此,表達(dá)式this.class.methods.name可以用Java表示如下:

List methodNames = new ArrayList();
for (Method method : this.getClass().getMethods()) {
methodNames.add(method.getName());
}
return methodNames;

在存在集合的GPath表達(dá)式中也可以使用數(shù)組訪(fǎng)問(wèn)表示法:

assert 'aSecondMethodBar' == this.class.methods.name.grep(~/.*Bar/).sort()[1]

PS: 1.grep()方法是一個(gè)正則表達(dá)式方法,用于查找字符串,方法中的傳參是正則匹配哦。

2.在GPath表達(dá)式中,數(shù)組訪(fǎng)問(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)有的寫(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è)贊謝謝。


本文標(biāo)題:Groovy語(yǔ)法-表達(dá)式知識(shí)學(xué)習(xí)
本文地址:http://www.5511xx.com/article/dpcsipc.html