自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Groovy 語(yǔ)法-表達(dá)式知識(shí)學(xué)習(xí)

開(kāi)發(fā) 前端
本篇主要介紹了一下Groovy的表達(dá)式的定義和GPath表達(dá)式的簡(jiǎn)單定義。其中GPath是java中沒(méi)有的寫(xiě)法??梢灾С侄嗉?jí)對(duì)象結(jié)構(gòu),也可以用于Json,XMl的解析中來(lái)。

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á)式示例

描述

??foo??

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

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

特殊名字

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

??String.class??

類(lèi)名稱值

??(?? 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中用于成員訪問(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的方法:

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類(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 方法名稱

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表示如下:

List<String> methodNames = new ArrayList<String>();
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 = """
| <root>
| <level>
| <sublevel id='1'>
| <keyVal>
| <key>mykey</key>
| <value>value 123</value>
| </keyVal>
| </sublevel>
| <sublevel id='2'>
| <keyVal>
| <key>anotherKey</key>
| <value>42</value>
| </keyVal>
| <keyVal>
| <key>mykey</key>
| <value>fizzbuzz</value>
| </keyVal>
| </sublevel>
| </level>
| </root>
"""

定義了一個(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è)贊謝謝。

責(zé)任編輯:武曉燕 來(lái)源: zinyan
相關(guān)推薦

2009-06-15 17:24:59

Groovy正則表達(dá)式

2024-02-02 12:41:33

表達(dá)式語(yǔ)法Cron

2018-09-27 15:25:08

正則表達(dá)式前端

2010-07-28 11:06:41

Flex正則表達(dá)式

2010-07-13 17:03:53

Perl正則表達(dá)式

2016-11-10 16:21:22

Java 正則表達(dá)式

2009-12-08 18:18:17

PHP表達(dá)式

2011-04-22 11:07:24

groovyJava

2009-08-20 16:23:32

C#正則表達(dá)式語(yǔ)法

2014-01-05 17:41:09

PostgreSQL表達(dá)式

2009-08-26 16:17:23

C# Lambda表達(dá)

2023-01-04 08:39:34

2011-08-29 18:43:45

MDX多維查詢表達(dá)式

2009-08-13 15:24:27

C#正則表達(dá)式

2009-08-11 13:00:41

C#正則表達(dá)式

2009-09-08 09:32:13

正則表達(dá)式學(xué)習(xí)

2009-08-07 14:31:40

.NET正則表達(dá)式基礎(chǔ)

2009-08-14 16:50:59

C#正則表達(dá)式語(yǔ)法

2024-03-25 13:46:12

C#Lambda編程

2022-12-26 08:36:53

Groovy語(yǔ)法控制結(jié)構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)