当前位置: 首页 > 科技观察

Groovy语法-表达知识学习

时间:2023-03-19 21:15:20 科技观察

1.前言本文是Groovy学习笔记的第31篇。继续学习语法相关的知识点。本文的重点是Expressions(表达式)的相关知识点。表达式是Groovy程序的构建块,用于引用现有值并执行代码以创建新值。2.表达式Groovy支持很多和Java一样的表达式,如下:true,10,“bar”ValueString.class类名Value(expression)带括号表达式foo++,~bar一元运算符表达式foo+bar,bar*baz二元运算符表达式foo?bar:bazTernaryoperatorexpression(Integerx,Integery)→x+yLambdaexpressionassert'bar'==switch('foo'){case'foo'->'bar'}该switch表达式上面的表达式形式是java也支持的表达式。而Groovy也有一些自己特有的表达式:表达式示例descriptionStringabbreviatedtext(whenambiguous){x,y→x+y}闭包表达式[1,3,5]字面量列表(List)表达式[a:2,b:4,c:6]文字映射(Map)表达式Groovy还扩展了Java的普通成员访问点表示法。Groovy通过为一些感兴趣的数据指定层次结构中的路径,为访问层次结构数据结构提供特殊支持。这些Groovy路径表达式称为GPath表达式。2.1GPath表达式GPath是一种集成到Groovy中的路径表达式语言,它允许识别部分嵌套的结构化数据。从这个意义上说,它的目标和范围类似于XPath对XML的作用。GPath通常用于处理XML,但它确实适用于任何对象图。XPath使用类似文件系统的路径表示法(树层次结构由斜杠/部分分隔),GPath使用点对象表示法来执行对象导航。例如,可以指定感兴趣的对象或元素的路径:a.b.c:可以在xml中表示,b中的所有c元素都在a中生成。a.b.c:可以在POJOS对象中表示,为a的所有b属性生成c属性。类似于:a.getB().getC()。在这两种情况下,GPath表达式都可以看作是对对象图的查询。对于POJO,对象图通常由通过对象实例化和组合编写的程序构建;对于XML处理,对象图是解析XML文本的结果,通常使用XmlParser或XmlSlurper等类。有关在Groovy中使用XML的更多详细信息,请参阅使用XML。PS:这里就不详细介绍如何处理XML文件了。如果想了解XML文件的处理,可以阅读:https://img.ydisp.cn/news/20221228/yfrdktnqw34data-id="u738a58b-LSJo1YM3">a["@href"]:class映射表示法,所有a元素的href属性。A。'@href':属性符号:另一种表达方式。a.@href:Directrepresentation:另一种表达方式PS:后面学习XML解析的时候会详细介绍。这是一个简短的解释。2.2对象导航让我们看一个简单对象图上的GPath表达式的例子,一个使用java反射获得的表达式。假设您在一个类的非静态方法中,该类具有另一个名为aMethodFoo的方法:voidaMethodFoo(){println"ThisisaMethodFoo."以下GPath表达式将获取方法的名称:assert['aMethodFoo']==this.class.methods.name.grep(~/.*Foo/)更准确地说,上面的GPath表达式生成一个字符串列表,其中每个都是此名称上的现有方法,名称以Foo结尾。现在,假设Foo类中有以下方法:voidaMethodBar(){println"ThisisaMethodBar."}voidanotherFooMethod(){println“这是另一个FooMethod。”}voidaSecondMethodBar(){println“这是一个SecondMethodBar。”然后下面的GPath表达式将获得aMethodBar和aSecondMethodBar方法名称assert['aMethodBar','aSecondMethodBar']asSet==this.class.methods.name.grep(~/.*Bar/)asSet2.3解构表达式我们可以分解表达式this.class.methods.name.grep(~/.*Bar/)来理解如何计算GPath:this.class:attributeaccessor,这里相当于java中的this.getClass()方法生成一个类对象。this.class.methods:属性访问器,相当于this.getClass().getMethods()生成一个Method对象数组。this.class.methods.name:将属性访问器应用于Method数组的每个元素并生成结果列表。this.class.methods.name.grep(...):对this.class.methods生成的列表的每个元素调用方法grep并生成结果列表。GPath表达式的一个强大功能是将集合的属性访问转换为集合中每个元素的属性访问,并将结果收集到集合中。因此,表达式this.class.methods.name可以用Java表示如下:ListmethodNames=newArrayList();对于(方法方法:this.getClass().getMethods()){methodNames.add(method.getName());}returnmethodNames;数组访问符号也可以用在带有集合的GPath表达式中:assert'aSecondMethodBar'==this.class.methods.name.grep(~/.*Bar/).sort()[1]PS:1.grep()方法是一种正则表达式方法,用于搜索字符串。方法中传入的参数是正则匹配。2.在GPath表达式中,数组访问从零开始。2.4GPath的XML导航下面是XML文档和各种形式的GPath表达式的示例:defxmlText="""|||||mykey|value123|||||anotherKey|42|||mykey|fizzbuzz||||"""定义了一个xmlText变量,其参数内容为一个xml。接下来通过GPath导航配置读取相关内容:defroot=newXmlSlurper().parseText(xmlText.stripMargin())println(root.level.size())//Output:1因为root下只有一个levelprintln(root.level.sublevel.size)//输出:2因为level下面有两个sublevelprintln(root.level.sublevel.findAll{it.@id==1}.size())//找到下面的id值1的子级别。输出:1println(root.level.sublevel[0].keyVal[0].ket.text())//输出:mykey3。小结本文主要介绍Groovy表达式的定义和GPath表达式的简单定义。其中GPath不是用java写的。可以支持多层次的对象结构,也可以用于Json和XMl的解析。以上相关内容,请参考Groovy官方文档:GroovyLanguageDocumentation(groovy-lang.org)下一篇,继续学习语法。如果觉得总结的还可以,希望大家点个赞。谢谢。