`
yanfaguanli
  • 浏览: 682411 次
文章分类
社区版块
存档分类
最新评论

Groovy常用语法总结

 
阅读更多

目录(?)[+]

过去半年都在写Groovy,基本都是在实战中学习,从java转过来,也还没什么问题,毕竟基础,架构都没变。

Groovy的强大特性中,Closure,MetaClass都尝试过,Closure基本上就是当方法或者回调接口使用,再高级的用法就没用过了,没有特别体会什么好处,当回调接口就是省的定义接口,简洁了一些;MetaClass就有专门为一个模块做了些MetaClass,和GORM差不多的,给一些类加了save,update,delete之类的方法,不同的是GORM是存到数据库,我做的那模块是调用Restful Service,还不错,如果有需求是不能改变类而要给类加方法,还是很适用的。但是在绝大部分情况下,这些优势都体现不出来,到目前位置,还是对Groovy的一些语法印象深刻些,总结一些常用的语法:

1.List,和Map的初始化

这个用的最多了,原来java的时候,非要新建一个List或者Map,然后把element一个一个加进去,特繁琐。用Groovy在语法上简洁了很多。

定义一个List:

  1. ListintList=[1,3,5,7,9]
  2. ListstringList=['a','b','']

定义一个Map:
  1. Mapmap=[a:4,b:'d']

定义Map的时候,对于key,如果像上面的例子一样,没有特别指示,那所有key都是String类型的,key值就是‘a’,'b',上面的例子等价于

  1. Mapmap=['a':4,'b':'d']

某些时候,map的key可能是存在的一个变量,那这个时候,就要用括号把key抱起来,比如
  1. Stringa='IamKey'
  2. Mapmap=[(a):'IamValue']

也可以定义空的List或者Map
  1. Listempty=[]
  2. Mapempty=[:]

需要知道的是,这种方式新建的List实例是ArrayList,Map实例是LinkedHashMap

2.二元运算符 ?:

java继承了C语言的问号表达式,二元运算符就是更加精简的问号表达式。形式:

  1. defresult=a?:b

意为,如果条件为真,即a为true或者a有值,则result为a,否则result为b

3.安全占位符

这个很有用,可以避免很多NullPointerException,但是也不能滥用了

  1. defresult=obj?.property

代码里,obj是个对象,property是对象的一个熟悉,这行代码的意思,如果obj不为null,则会返回property属性的值,如果obj为null,这会直接返回null。语句可以一直串下去
  1. defresult=a?.b?.c?.d...


4.字段操作

按照Groovy Bean的标准,默认的时候类里面的所有字段,Groovy都会帮忙生成一个get方法。在类的外部,即便你直接用了属性名而不用get方法去取值,拿到的也是通过get方法拿到的值。如果想直接拿属性值怎么办呢? 通过字段运算符:

  1. classA{
  2. Stringb
  3. }
  4. Aa=newA()
  5. a.b//通过get方法拿值
  6. a.getB()//通过get方法拿值
  7. a.@b//直接拿值

5.GString

Java里有String,Groovy里新加了GString。Groovy的语法是,如果用单引号括起来的就是String,如果是双引号括起来的就是GString。所以Groovy不能直接定义原来Java里的char了。

String

  1. Strings='ThisisaString'

GString
  1. GStrings="ThisisaGString"

两种方式定义出来的实例类型是不一样的。当然GString不是这么简单的,GString的强大之处在于它可以作为模板使用
  1. Stringname='count'
  2. intvalue1=23
  3. intvalue2=22
  4. GStrings="Thevalueof$nameis${value1+value2}"
  5. printlns

最终的输出是: The value of count is 55

倒数第二行,里面有关键字符 $, $即代表去引用上下文中的变量值,而${}中间不仅可以引用变量值,还可以加上一些运算,作为一个表达式

最后一行这是把GString转换成String,再输出。

String是常量,但是GString是变量,准确的说,在GString中的$仅仅是作为一个模板的占位符存在,GString会保存对那个对象的引用,如果引用的对象值发生改变,GString的值也就跟着改变。

需要注意的是,Map里面String和GString就算最终生成的String值一样,但是还是当作两个key存在的。很容易理解,但是很容易犯的错误,比如手误把单引号写成了双引号等等都会引起这个错误。

6.构造函数

  1. classClassA{
  2. Strings1
  3. inti1
  4. ClassBcb
  5. }
  6. classClassB{
  7. Strings2
  8. }
  9. newClassA(s1:'proinA',i1:5,cb:[s2:'proinB'])

以上代码是可以工作的,Groovy会创建一个ClassA的实例,并把‘pro in A’ 和 5 分别设到属性s1和i1里。即便有一个复杂类型的熟悉cb,也能正常工作,ClassB的对象会被创建出来,并设到属性cb上。ClassB里的s2熟悉当然就是'pro in B'了。

可以看到构造函数里的参数很像Map的定义,确实,其实传入Map也是可以的

  1. newClassA([s1:'proinA',i1:5,cb:[s2:'proinB']])

这个功能,在一些数据模型转换的时候,比较方便。打个比方,前台来的JSON数据,直接全转成Map,再用构造函数new一下,就全部出来了。注意的是,如果Map存在某个类里没有的属性值,会出错误的。

7.asType

用Groovy的是,可能经常看到这样的代码

  1. Stringa='78'
  2. intb=aasint
  3. printb

第二行,有个关键字as,可以看出来作用就是把String类型的a转成int类型的b。它是怎么工作的呢,很简单,就是把这个操作代理给了String的asType方法,比如String有如下的方法(仅仅是例子,代码中不是这样)
  1. classString{
  2. ObjectasType(Classclz){
  3. if(clz==Integer){
  4. returnInteger.parseInt(this)
  5. }elseif(clz==GString){
  6. return"$this"
  7. }else{
  8. returnsuper.asType(clz)
  9. }
  10. }
  11. }

那么,String就可以用as运算符转换成int或者GString类型
  1. Stringa='45'
  2. intb=aasint
  3. GStringc=aasGString

上面的clz == GString 是合法的,在Groovy里等价于clz == GString.class

8. inspect和eval

eval就和javascript里的eval一样,就是直接执行一段Groovy脚本,可以用Eval.me(...script here...)直接调用。

inspect就是eval的反相操作了,就是把一个对象转成一个合法的可执行的脚本(我的理解,没仔细看过文档)。没试过其他对象,但是像Map,List之类的都可以转出来。这就够了,Map,List转出来的数据之于Groovy就相当于JSON之于JavaScript。在系统内部的时候就可以直接当作数据传输,虽然大家都不推荐这么用,但是我还是坚持,如果数据只包含Map,List,Number,String等简单类型,为什么不用呢?(如果Number里值是NaN或者Infinite的时候有问题,但是很容易解决,看Eval类里的其他两个方法就知道了)。呵呵,我也就这么用着,直到发现了一个Bug(http://stackoverflow.com/questions/7410252/groovy-inspect-handle-dollar-sign),没法解决,我才换掉了实现。

但是我对这个东西还是有很大期待,如果都是内部集成,不存在安全问题,且没有很好JSON支持的时候,这种方式还是很好的方式。


9.is方法

按照Groovy的定义,== 操作等于调用equals方法。这样,我们就失去了直接判断两个对象是不是同一对象的运算符。要判断是不是同一个对象,要调用is方法,比如thisObject.is(anotherObject)。这点非常重要,特别是在overwrite对象的equals方法的时候,eclipse自动生成的代码里面有些地方不能直接用==了,而要用is方法。

就这么多吧,以后如果发现更多新东西的时候再加。

过去半年都在写Groovy,基本都是在实战中学习,从java转过来,也还没什么问题,毕竟基础,架构都没变。

Groovy的强大特性中,Closure,MetaClass都尝试过,Closure基本上就是当方法或者回调接口使用,再高级的用法就没用过了,没有特别体会什么好处,当回调接口就是省的定义接口,简洁了一些;MetaClass就有专门为一个模块做了些MetaClass,和GORM差不多的,给一些类加了save,update,delete之类的方法,不同的是GORM是存到数据库,我做的那模块是调用Restful Service,还不错,如果有需求是不能改变类而要给类加方法,还是很适用的。但是在绝大部分情况下,这些优势都体现不出来,到目前位置,还是对Groovy的一些语法印象深刻些,总结一些常用的语法:

1.List,和Map的初始化

这个用的最多了,原来java的时候,非要新建一个List或者Map,然后把element一个一个加进去,特繁琐。用Groovy在语法上简洁了很多。

定义一个List:

  1. ListintList=[1,3,5,7,9]
  2. ListstringList=['a','b','']

定义一个Map:
  1. Mapmap=[a:4,b:'d']

定义Map的时候,对于key,如果像上面的例子一样,没有特别指示,那所有key都是String类型的,key值就是‘a’,'b',上面的例子等价于

  1. Mapmap=['a':4,'b':'d']

某些时候,map的key可能是存在的一个变量,那这个时候,就要用括号把key抱起来,比如
  1. Stringa='IamKey'
  2. Mapmap=[(a):'IamValue']

也可以定义空的List或者Map
  1. Listempty=[]
  2. Mapempty=[:]

需要知道的是,这种方式新建的List实例是ArrayList,Map实例是LinkedHashMap

2.二元运算符 ?:

java继承了C语言的问号表达式,二元运算符就是更加精简的问号表达式。形式:

  1. defresult=a?:b

意为,如果条件为真,即a为true或者a有值,则result为a,否则result为b

3.安全占位符

这个很有用,可以避免很多NullPointerException,但是也不能滥用了

  1. defresult=obj?.property

代码里,obj是个对象,property是对象的一个熟悉,这行代码的意思,如果obj不为null,则会返回property属性的值,如果obj为null,这会直接返回null。语句可以一直串下去
  1. defresult=a?.b?.c?.d...


4.字段操作

按照Groovy Bean的标准,默认的时候类里面的所有字段,Groovy都会帮忙生成一个get方法。在类的外部,即便你直接用了属性名而不用get方法去取值,拿到的也是通过get方法拿到的值。如果想直接拿属性值怎么办呢? 通过字段运算符:

  1. classA{
  2. Stringb
  3. }
  4. Aa=newA()
  5. a.b//通过get方法拿值
  6. a.getB()//通过get方法拿值
  7. a.@b//直接拿值

5.GString

Java里有String,Groovy里新加了GString。Groovy的语法是,如果用单引号括起来的就是String,如果是双引号括起来的就是GString。所以Groovy不能直接定义原来Java里的char了。

String

  1. Strings='ThisisaString'

GString
  1. GStrings="ThisisaGString"

两种方式定义出来的实例类型是不一样的。当然GString不是这么简单的,GString的强大之处在于它可以作为模板使用
  1. Stringname='count'
  2. intvalue1=23
  3. intvalue2=22
  4. GStrings="Thevalueof$nameis${value1+value2}"
  5. printlns

最终的输出是: The value of count is 55

倒数第二行,里面有关键字符 $, $即代表去引用上下文中的变量值,而${}中间不仅可以引用变量值,还可以加上一些运算,作为一个表达式

最后一行这是把GString转换成String,再输出。

String是常量,但是GString是变量,准确的说,在GString中的$仅仅是作为一个模板的占位符存在,GString会保存对那个对象的引用,如果引用的对象值发生改变,GString的值也就跟着改变。

需要注意的是,Map里面String和GString就算最终生成的String值一样,但是还是当作两个key存在的。很容易理解,但是很容易犯的错误,比如手误把单引号写成了双引号等等都会引起这个错误。

6.构造函数

  1. classClassA{
  2. Strings1
  3. inti1
  4. ClassBcb
  5. }
  6. classClassB{
  7. Strings2
  8. }
  9. newClassA(s1:'proinA',i1:5,cb:[s2:'proinB'])

以上代码是可以工作的,Groovy会创建一个ClassA的实例,并把‘pro in A’ 和 5 分别设到属性s1和i1里。即便有一个复杂类型的熟悉cb,也能正常工作,ClassB的对象会被创建出来,并设到属性cb上。ClassB里的s2熟悉当然就是'pro in B'了。

可以看到构造函数里的参数很像Map的定义,确实,其实传入Map也是可以的

  1. newClassA([s1:'proinA',i1:5,cb:[s2:'proinB']])

这个功能,在一些数据模型转换的时候,比较方便。打个比方,前台来的JSON数据,直接全转成Map,再用构造函数new一下,就全部出来了。注意的是,如果Map存在某个类里没有的属性值,会出错误的。

7.asType

用Groovy的是,可能经常看到这样的代码

  1. Stringa='78'
  2. intb=aasint
  3. printb

第二行,有个关键字as,可以看出来作用就是把String类型的a转成int类型的b。它是怎么工作的呢,很简单,就是把这个操作代理给了String的asType方法,比如String有如下的方法(仅仅是例子,代码中不是这样)
  1. classString{
  2. ObjectasType(Classclz){
  3. if(clz==Integer){
  4. returnInteger.parseInt(this)
  5. }elseif(clz==GString){
  6. return"$this"
  7. }else{
  8. returnsuper.asType(clz)
  9. }
  10. }
  11. }

那么,String就可以用as运算符转换成int或者GString类型
  1. Stringa='45'
  2. intb=aasint
  3. GStringc=aasGString

上面的clz == GString 是合法的,在Groovy里等价于clz == GString.class

8. inspect和eval

eval就和javascript里的eval一样,就是直接执行一段Groovy脚本,可以用Eval.me(...script here...)直接调用。

inspect就是eval的反相操作了,就是把一个对象转成一个合法的可执行的脚本(我的理解,没仔细看过文档)。没试过其他对象,但是像Map,List之类的都可以转出来。这就够了,Map,List转出来的数据之于Groovy就相当于JSON之于JavaScript。在系统内部的时候就可以直接当作数据传输,虽然大家都不推荐这么用,但是我还是坚持,如果数据只包含Map,List,Number,String等简单类型,为什么不用呢?(如果Number里值是NaN或者Infinite的时候有问题,但是很容易解决,看Eval类里的其他两个方法就知道了)。呵呵,我也就这么用着,直到发现了一个Bug(http://stackoverflow.com/questions/7410252/groovy-inspect-handle-dollar-sign),没法解决,我才换掉了实现。

但是我对这个东西还是有很大期待,如果都是内部集成,不存在安全问题,且没有很好JSON支持的时候,这种方式还是很好的方式。


9.is方法

按照Groovy的定义,== 操作等于调用equals方法。这样,我们就失去了直接判断两个对象是不是同一对象的运算符。要判断是不是同一个对象,要调用is方法,比如thisObject.is(anotherObject)。这点非常重要,特别是在overwrite对象的equals方法的时候,eclipse自动生成的代码里面有些地方不能直接用==了,而要用is方法。

就这么多吧,以后如果发现更多新东西的时候再加。

分享到:
评论

相关推荐

    groovy基础语法.pdf

    由于文件内容有些混乱,并且含有重复的词汇和一些扫描错误,以上总结的知识点基于对Groovy语言的理解和部分可识别内容的解读。在实践中,应当参考Groovy的官方文档或相关教程以获得更准确和全面的信息。

    Groovy in action

    - **附录B:Groovy语言信息**:总结了Groovy的核心语言特性。 - **附录C:GDK API快速参考**:提供了GDK API的简明指南。 - **附录D:速查表**:包含了一些常用命令和语法的快速查阅表。 #### 五、结语 《Groovy ...

    Groovy_Installation_Eclipse_Plugin

    Groovy 的语法简洁且易于学习,支持多种编程范式,包括函数式编程和元编程等。为了更高效地开发和调试 Groovy 应用程序,开发者通常会选择集成开发环境 (IDE)。其中,Eclipse 是最常用的开源 IDE 之一。本篇文章将...

    lang-groovy-2.0.0-final.zip

    总结来说,Groovy 2.0.0-final和Lucene-Sugar的结合,展示了开源项目如何通过创新和共享,提升开发者的体验。通过学习和应用这些工具,我们可以更好地利用Java平台的力量,构建出高效、易用的搜索解决方案。无论是...

    Groovy+quick+start.pdf

    - **说明**: Groovy 中的 `yield` 语法类似于 Python 和 Ruby 中的迭代器生成方式,可以通过闭包来创建迭代器。 - **示例代码**: ```groovy class Foo { static void main(String[] args) { // yield 代码示例 ...

    gradle总结

    对于gradle,groovy语法总结, 具体到gradle插架的生成,groovy及gradle文档查询方式

    vim插件----代码补全,高亮,文件浏览等等

    `Janus`则是一个预配置的Vim发行版,集成了许多常用插件和配置,包括多种语言的语法高亮。 三、文件浏览 在大型项目中,快速浏览和跳转文件是一项重要任务。Vim的`NERDTree`插件可以创建一个侧边栏,显示当前工作...

    Grails Dynamic Tag Libraries.pdf

    JSP(Java Server Pages)是一种常用的服务器端脚本技术,用于生成动态网页内容。然而,传统的JSP标签库存在以下问题: 1. **过于灵活**:这种灵活性实际上导致了一个贫乏的API设计,使得开发者难以掌握其全部功能...

    gradle英文教程

    - **为什么选择 Groovy**:Groovy 是一种运行于 Java 平台上的编程语言,它与 Java 完全兼容,并且具有更简洁的语法和更强大的元编程能力。Gradle 选择 Groovy 作为构建脚本的语言,是因为它可以提供更清晰、简洁且...

    Gradle user guide(2.7)

    ### Gradle用户指南2.7版关键...- **Groovy基础知识**:简要介绍一些必要的Groovy语法和特性。 #### 12. 更多关于任务 - **定义任务**:如何定义新的任务。 - **定位任务**:如何在复杂的构建文件中找到特定任务。

    关于 Java 的基本概念、特性、常用工具和应用领域的简要介绍

    - **Gradle**:基于 Groovy 语言,Gradle 提供了更为灵活和高效的构建解决方案,支持多种语言和平台。 #### 四、常用 Java 库和框架 **4.1 Spring 框架** Spring 是目前最为流行的企业级 Java 框架之一,提供了...

    jte-pipeline-config:Jenkins模板引擎配置

    Groovy的语法简洁,与Java高度兼容,同时提供了许多便利的功能,如闭包和元编程,这使得它成为编写Jenkins Pipeline的理想选择。在jte-pipeline-config中,Groovy用于编写模板和实现变量替换、条件判断等逻辑。 **3...

    gradle 用户指南

    - **表达能力强:** Groovy语法简洁明了,非常适合用于编写构建脚本。 #### 二、入门教程 **3.1 入门** - **快速上手:** 介绍如何快速安装Gradle并创建一个简单的构建任务。 - **环境搭建:** 包括设置环境变量、...

    项目构建工具Gradle官方用户手册(英文)

    - **收藏夹**:将常用的构建任务添加到收藏夹中,快速访问。 - **命令行操作**:在图形界面中直接使用命令行。 - **设置**:配置图形界面的各个参数。 #### 6. 编写构建脚本 - **Gradle构建语言**:Gradle构建脚本...

    R大(国内JVM权威)资料合集

    - **重要性**: JVM不仅限于Java,还能支持其他编译为目标字节码的语言,如Scala、Groovy等。它提供了一种跨平台的执行环境,使得Java程序无需重新编译就能在任何安装了JVM的操作系统上运行。 #### 2. 编程语言与...

    gradle用户手册中文版

    3. **简洁且可扩展的配置语法** - Gradle使用Groovy作为配置语言,使得构建脚本既简洁又具有强大的表达能力。 - 开发者可以通过编写自定义脚本来扩展Gradle的功能,实现高度定制化的构建流程。 4. **跨平台兼容性...

Global site tag (gtag.js) - Google Analytics