groovy 经常使用语法总结

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

1.List,和Map的初始化java

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

定义一个List: 安全

[java] view plaincopyeclipse

List intList = [1,3,5,7,9]  函数

List stringList = ['a', 'b','']  this


定义一个Map:spa

[java] view plaincopy代理

Map map = [a:4,b:'d']  orm


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

[java] view plaincopy

Map map = ['a':4,'b':'d']  


某些时候,map的key多是存在的一个变量,那这个时候,就要用括号把key抱起来,好比

[java] view plaincopy

String a = 'I am Key'  

Map map = [(a):'I am Value']  


也能够定义空的List或者Map

[java] view plaincopy

List empty = []  

Map empty = [:]  

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

2.二元运算符 ?:

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

[java] view plaincopy

def result = a ?: b  


意为,若是条件为真,即a为true或者a有值,则result为a,不然result为b

3.安全占位符

这个颇有用,能够避免不少NullPointerException,可是也不能滥用了

[java] view plaincopy

def result = obj?.property  


代码里,obj是个对象,property是对象的一个熟悉,这行代码的意思,若是obj不为null,则会返回property属性的值,若是obj为null,这会直接返回null。语句能够一直串下去

[java] view plaincopy

def result = a?.b?.c?.d...  


4.字段操做

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

[java] view plaincopy

class A {  

   String b  

}  

  

A a = new A()  

a.b //经过get方法拿值  

a.getB() //经过get方法拿值  

a.@b //直接拿值  


5.GString

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

String

[java] view plaincopy

String s = 'This is a String'  


GString

[java] view plaincopy

GString s = "This is a GString"  


两种方式定义出来的实例类型是不同的。固然GString不是这么简单的,GString的强大之处在于它能够做为模板使用

[java] view plaincopy

String name = 'count'  

int value1 = 23  

int value2 = 22  

GString s = "The value of $name is ${value1+value2}"   

println s  


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

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

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

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

须要注意的是,Map里面String和GString就算最终生成的String值同样,可是仍是看成两个key存在的。很容易理解,可是很容易犯的错误,好比手误把单引号写成了双引号等等都会引发这个错误。

6.构造函数

[java] view plaincopy

class ClassA {  

    String s1  

    int i1  

    ClassB cb  

}  

class ClassB {  

    String s2  

}  

new ClassA(s1:'pro in A', i1:5, cb:[s2:'pro in B'])  


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

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

[java] view plaincopy

new ClassA([s1:'pro in A', i1:5, cb:[s2:'pro in B']])  


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

7.asType

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

[java] view plaincopy

String a = '78'  

int b = a as int  

print b  


第二行,有个关键字as,能够看出来做用就是把String类型的a转成int类型的b。它是怎么工做的呢,很简单,就是把这个操做代理给了String的asType方法,好比String有以下的方法(仅仅是例子,代码中不是这样)

[java] view plaincopy

class String {  

    Object asType(Class clz) {  

         if(clz == Integer) {  

                return Integer.parseInt(this)  

         } else if(clz == GString) {  

                 return "$this"  

         } else {  

                 return super.asType(clz)  

         }  

    }  

}  


那么,String就能够用as运算符转换成int或者GString类型

[java] view plaincopy

String a = '45'  

int b = a as int  

GString c = a as GString  


上面的 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方法。


就这么多吧,之后若是发现更多新东西的时候再加。

相关文章
相关标签/搜索