Groovy-Gpath总结

Groovy Gpath

两个类之间的访问

class Address{
    String prov
    String city
}

class Person{
    String id
    String name
    Address addr // 关联地址类
}

//Gpath来操作它们
def addr = new Address(prov:'Hubei',city:'Xiaogan')
def person = new Person(id:123,name:'Wallace',addr:addr)
println person.name
println person.addr.city

值得注意的是,上面的嵌套访问并不是安全的。请看下面的例子:

 def person = new Person(id:123,name:'Wallace')  
 println person.addr.city
  • 这样的访问就会报空指针的错误。为了解决这种空指针的错误,在Java语言中通常要做如下的非空判断:
if(person!=null&&person.addr!=null){
     println person.addr.city
  }
  • groovy处理简单很多,只要用?.操作即可,它的结果是如果Gpath访问的对象存在,则返回结果;否则返回null
def person = new Person(id:123,name:'Wallace')
println person?.addr?.city

对xml的操作

def text = """
            <persons>
               <person sex='male'>
                   <id>1</id>
                   <name>Tom</name>
               </person>
               <person sex='female'>
                  <id>2</id>
                  <name>Alice</name>
               </person>
           </persons>
      """

def node = new XmlSlurper().parseText(text)

node.person.each{
    println it.name
}

Gpath对XML的访问不会存在空指针的情况,而会直接返回null。请看下面的例子:

println node.p.x

访问GroovyBean

用Gpath访问GroovyBean对象的属性并不是直接访问该属性,而是通过“set”和“get”方法进行的

class Person
{
    String id
    String name
    Address addr
   
    def getName()
    {
       return 'Tom'
    }
}

在上面的“Person”类中,我们自己定义了“getName”方法,让它永远返回“Tom”,下面,我们使用Gpath来测试它:

def person = new Person(id:123,name:'Wallace')
println person.name

运行结果为:
Tom

由于我们在“person”对象的定义中设置了“name”属性的值为“Wallace”,很明显,“person”对象的“name”属性值为“Wallace”,但我们使用“person.name”访问的返回值只能是“Tom”,因为方法“getName”永远返回“Tom”。
当然,我们也有办法访问属性的真实值,这就是使用.@操作符。请看下面的例子

def person = new Person(id:123,name:'Wallace')
println person.name 
println person.@name

运行结果为:
Tom
Wallace

“.@”操作xml

通过Gpath访问XML的时候,“.@”操作符也有它自己的用途。请看下面的例子:

 def text = """
            <persons>
               <person sex='male'>
                   <id>1</id>
                   <name>Tom</name>
               </person>
               <person sex='female'>
                  <id>2</id>
                  <name>Alice</name>
               </person>
           </persons>
      """
     
      def node = new XmlSlurper().parseText(text)
     
      node.person.each{
         println it.@sex
  }

运行结果为:
male
female

可以看出,使用“.@”操作符可以访问一个节点的属性。

查看原文

Groovy的展开操作符(Spread Operator)*.*

*. 操作符称之为:spread-dot操作,即“展开(点)”操作。比如

list*.member

list.collect{ item -> item?.member } 

上面的是等效的。此处member可以是属性,也可以是get/set方法,甚至是一般的方法。如下例:

class SpreadDotDemo { 
   def count 
}
def list = [new SpreadDotDemo(count:1),new SpreadDotDemo(count:2),new SpreadDotDemo(count:5) ] 
assert 8==list*.count.sum() 
assert 8==list.count.sum()//去掉*也可以的

“*.”也是安全解引用操作符(Safe Dereference Operator也称为提领运算符),用以避免NullPointerException。

def SpreadDotDemo demo
demo.count //将抛空指针异常
demo*.count //避免了null的检查,并返回null
  • 跟spead doc操作符相关的事spead操作(*),它可以看作是逗号分隔的list的下标操作符的逆操作
def getList(){ 
   return [1,2,3] 
}
def sum(a,b,c){ 
   return a + b + c 
}
assert 6 == sum(*list) 
def range = (1..3)
assert [0,1,2,3] == [0,*range]

相同的戏法同样可以应用在 map 上:

def map = [a:1,b:2]
assert [a:1, b:2, c:3] == [c:3, *:map]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容