groovy 常用语法总结

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

1.List,和Map的初始化

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

定义一个List:

[java] view plaincopy

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

List stringList = [‘a‘, ‘b‘,‘‘]

定义一个Map:

[java] view plaincopy

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

定义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方法拿值

[email protected] //直接拿值

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方法。

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

时间: 2024-10-12 21:02:40

groovy 常用语法总结的相关文章

SQL常用语法大全

一.基础1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'--- 开始 备份BACKUP DATABASE pubs TO testBack 4.说明:创建新表create

Emmet常用语法

Emmet常用语法1.输入!和html:5(不能大写),按下TAB 键,快速生成一个 HTML5 的标准文档初始结构. html:xt 生成 HTML4 过渡型 html:4s 生成 HTML4 严格型2.生成带有 id .class 的 HTML 标签 (1)Emmet 的语法有点类似 CSS 的语法,生成 id 为 aaa 的 div 标签,我们只需要编写下面指令:#aaaEmmet 默认的标签为 div ,如果我们不给出标签名称的话,默认就生成 div 标签. (2)如果编写一个 clas

php正则表达式入门-常用语法格式

原文地址:http://www.jbxue.com/article/24467.html 分享下php正则表达式中的一些常用语法格式,用于匹配字母.数字等,个人感觉还不错. 语法格式:位于定界符"/"之间.较为常用的元字符包括: “+”, “*”,以及 “?”.其中, “+”元字符规定其前导字符必须在目标对象中连续出现一次或多次, “*”元字符规定其前导字符必须在目标对象中出现零次或连续多次, 而“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次. /jim{2,6}/<

SQLServer2005 常用语法大全

SQL分类: DDL-数据定义语言(CREATE,ALTER,DROP,DECLARE) DML-数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL-数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,简要介绍基础语句: 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- 创建备份数据的 device U

ABAP 指針常用语法

1 .定义指針 :指針的定義主 要有以下語句 定義任意類型的指針,但是不具備欄位結構(僅僅是一個地址) FIELD-SYMBOLS <carrid> TYPE ANY. 參考數據庫表定義(這種指針是含有欄位結構的,參考內表同理) FIELD-SYMBOLS <sflight> TYPE sflight. FIELD-SYMBOLS <sflight> LIKE sflight. FIELD-SYMBOLS <sflight> LIKE LINE OF sfl

Oracle常用语法

1,case用法 SELECT CASE WHEN T.FLAG='0' THEN T.USERID WHEN T.FLAG='1' THEN T.ORGID ELSE NULL END AS '标识' FROM XTXMXX T 2,decode用法 --如果FLAG等于1,则转为USERID,如果为0,则转为ORGID,其他的为2 SELECT DECODE(T.FLAG,1,T.USERID,0,T.ORGID,2) FROM XTXMXX T ; 3,创建sequence -- Crea

T-SQL和MySQL的一些常用语法的区别

本文将主要列出MySQL与SqlServer的SQL语句的一些常用语法的不同之处,且以常用的存储过程的相关内容为主. 1. 标识符限定符 SqlServer [] MySql `` 2. 字符串相加 SqlServer 直接用 + MySql concat() 3. isnull() SqlServer isnull() MySql ifnull() 注意:MySql也有isnull()函数,但意义不一样 4. getdate() SqlServer getdate() MySql now()

jsp 4种常用语法3个编译指令7个动作指令

4种常用语法: 注释:<%--注释--%> 声明:<%!声明部分%> 输出:<%=%> 脚本:可以包含任何java可执行代码.例 <% for(int i=0; i<10; i++) { %> <% } %> 3个常用编译指令: page:针对当前页面的指令 include:指定包含另一页面 taglib:定义和访问自定义标签 7个动作指令 jsp:forward  将请求的处理转发到下一页面 jsp:param 传递参数,与其他支持参数的

Perl常用语法记录

Perl常用语法记录 ##包的切换和调用其它包的方式 #package A; #my $a=10; #package B; #print $A::a; #print $a;     ##local局部标识符的使用 #$aa=20; #{ # local $aa; # $aa=10; # print "$aa \n"; # #} #print $aa; ##别名的使用 =comment $b=10; $a=1; $c=200; { local *b; *b=*a; $b=20; prin