(1)List(java.util.List)
list =[1, 2, 'hello', new java.util.Date()]
assertlist.size() == 4
assertlist.get(2) == 'hello'
注意:一切都是对象(数字会自动转换)
(2)Map(java.util.Map)
map =['name':'James', 'location':'London']
assertmap.size() == 2
assertmap.get('name') == 'James'
(3)遍历集合
list =[1, 2, 3]
for (iin list) { println i }
2、闭包(Closures)
?闭包类似Java的内类,区别是闭包只有单一的方法可以调用,但可以有任意的参数
closure= { param | println("hello ${param}") }
closure.call("world!")
closure = { greeting, name | println(greeting + name)}
closure.call("hello ","world!")
l闭包用“{}”括起,“|”前面是参数,后面是处理语句,使用call调用
这里我们使用了一个 Groovy-Beta3 闭包定义,只是为了让您能看懂老版本Groovy的一些例子。在新的GroovyJSR中对闭包的定义略有改动,因为| 字符同时也是 Java中的位操作符;GroovyJSR 建议使用 Nice(另外一种JRE语言)样式的-> 分隔符代替它。
?第一个例子演示了在字符串内使用参数的形式:${param}
?第二个例子演示了多参数形式:用“,”分隔参数
?如果只有一个参数,可以不写,而使用缺省的参数“it”,如下面的例子:
closure= { println "hello " + it }
closure.call("world!")
3、each
?遍历集合,逐个传递给闭包
[1, 2,3].each { item | print "${item}-" }
?上面例子的输出结果是:1-2-3-
4、collect
?遍历集合,逐个传递给闭包,处理后的结果返回给对应的项
value =[1, 2, 3].collect { it * 2 }
assertvalue == [2, 4, 6]
5、find
?根据闭包断言,返回集合中找到的第一个项目
value =[1, 2, 3].find { it > 1 }
assertvalue == 2
6、findAll
?根据闭包断言,返回集合中所有找到的项目
value =[1, 2, 3].findAll { it > 1 }
assertvalue == [2, 3]
7、inject
?遍历集合,第一次将传递的值和集合项目传给闭包,将处理结果作为传递的值,和下一个集合项目传给闭包,依此类推
value =[1, 2, 3].inject('counting: ') { str, item | str + item}
assertvalue == "counting: 123"
value = [1, 2, 3].inject(0) { count, item | count + item}
assertvalue == 6
8、every
?如果集合中所有项目都匹配闭包断言,就返回true,否则返回false
value =[1, 2, 3].every { it < 5 }
assertvalue
value =[1, 2, 3].every { item | item < 3}
assert !value
9、any
?如果集合中任何项目匹配闭包断言,就返回true,否则返回false
value =[1, 2, 3].any { it > 2 }
assertvalue
value = [1, 2, 3].any { item | item > 3}
assertvalue == false
10、min/max
?返回集合中的最小/最大项目(对象必须可比较)
value =[9, 4, 2, 10, 5].max()
assertvalue == 10
value =[9, 4, 2, 10, 5].min()
assertvalue == 2
value =['x', 'y', 'a', 'z'].min()
assertvalue == 'a'
11、join
?连接集合中的值成一个字符串
value =[1, 2, 3].join('-')
assertvalue == '1-2-3'
12、yield
?在Python和Ruby中通过yield语句创建“yield”风格的iterators,在Groovy同样有效,只是使用的是闭包
class Foo{
static void main(args) {
foo = new Foo()
for (x in foo.myGenerator) {
print("${x}-")
}
}
myGenerator(Closureyield){
yield.call("A")
yield.call("B")
yield.call("C")
}
}
?例子的输出结果是:A-B-C-
?Cloures原型可以省略,call和括号同样可选,这样更象Python/Ruby
class Foo {
myGenerator(yield){
yield "A"
yield "B"
yield "C"
}
static void main(args) {
foo = new Foo()
foo.myGenerator { println "Called with ${it}" }
}
}
Groovy全攻略--嵌入篇
Groovy被设计得非常轻量级,很容易迁入到任何Java应用系统。
你可以使用BSF将Groovy脚本嵌入任何Java代码中.但是Groovy提供了一个轻量级的紧密集成.下面是3种主要方法:
1.使用Shell调试脚本或表达式
在Groovy中你可以使用GroovyShell对Groovy脚本和表达式进行调试.GroovyShell允许你通过Binding对象传入或传出变量.
//从Java代码中调用Groovy语句
Bindingbinding=newBinding();
binding.setVariable("foo",newInteger(2));
GroovyShellshell=newGroovyShell(binding);
Objectvalue=shell.evaluate("println'HelloWorld!';x=123;returnfoo*10");
assertvalue.equals(newInteger(20));
assertbinding.getVariable("x").equals(newInteger(123));
2.在Java中动态调用运行Groovy代码
你可以使用GroovyClassLoader将Groovy的类动态地载入到Java程序中并直接使用或运行它.
下面是一个例子:
ClassLoaderparent=getClass().getClassLoader();
GroovyClassLoaderloader=newGroovyClassLoader(parent);
ClassgroovyClass=loader.parseClass(newFile("src/test/groovy/script/HelloWorld.groovy"));
//调用实例中的某个方法
GroovyObjectgroovyObject=(GroovyObject)groovyClass.newInstance();
Object[]args={};
groovyObject.invokeMethod("run",args);
如果你想使用一个用Groovy脚本实现的接口,你可以这么使用它:
GroovyClassLoadergcl=newGroovyClassLoader();
Classclazz=gcl.parseClass(myStringwithGroovyClassSource"SomeName.groovy");
ObjectaScript=clazz.newInstance();
MyInterfacemyObject=(MyInterface)aScript;
myObject.interfaceMethod();
如果某个Groovy类实现口MyInterface接口,那么上面的代码就会很好的工作.myObject的使用方法与其他实现了MyInterface接口的Java对象一样.
3.Groovy脚本引擎
对于那些想将Groovy脚本嵌入到服务器并且在每次修改后重新装入的人来说,Groovy脚本引擎提供了一个彻底的解决方案.你可以设定系列CLASSPATH作为根来初始化Groovy脚本引擎,这些GLASSPATH可以是URL也可以是目录名.接着你就可以这些根路径下的任何Groovy脚本了.GSE会跟踪脚本间的依赖关系,因此如果任何有依赖关系的脚本被修改,整颗树将会重新编译和载入.
另外,每次执行脚本时,你都可以传入一个包含脚本可接受属性的Binding.脚本执行完以后,传入脚本中的那些属性在Binding中依然有效.下面是一个例子:
/my/groovy/script/path/hello.groovy:
output="Hello,${input}!"
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
String[]roots= new String[]{" /my/groovy/script/path" };
GroovyScriptEnginegse= new GroovyScriptEngine(roots);
Bindingbinding= new Binding();
binding.setVariable( " input " ," world " );
gse.run( " test.groovy " ,binding);
System.out.println(binding.getVariable( " output " ));
将打印 "Hello,world!".
4.运行时依赖
和JDK1.4一样,GroovyJar也依赖与ASM库上的运行时,ASM库包括4个Jar(asm-2.1.jar, asm-util-2.1.jar,asm-attrs-2.1.jar and asm-analysis-2.1). 也就是说,只要将上面的5个Jar添加到路径中,你就能将轻松地Groovy嵌入到你的应用里.
另一种方案可以不用那么多的Jar.你可以用GROOVY_HOME/embeddable目录下的groovy-all-1.0-beta-x.jar.这个Jar包将Groovy和ASM组合打包成一个方便的Jar包.注意:groovy-all-1.0-beta-x.jar中的ASM类使用了不同的命名空间,因此要避免与使用ASM的库发生冲突.
Groovy全攻略--运行篇
Groovy脚本是一个包含许多语句和类声明的文本文件.Groovy的用法和其他脚本语言类似.下面是几种运行Groovy脚本的方法:
1.使用交互控制台
Groovy有一个Swing交互控制台,允许你像使用SQL工具一样输入和执行Groovy语句.控制台支持历史记录,因此你可以向前或向后遍历命令.
如果你已经安装了Groovy二进制分发包,你可以使用下面的命令启动GroovySwing控制台.
如果像启动命令行控制台,可以输入下面的命令:
GroovyConsole
如果想启动命令行控制台,可以输入下面的命令
Groovysh
从源代码分发包中启动SwingGroovy控制台
mavenconsole
2.通过IDE运行Groovy脚本
有一个叫做GroovyShell的类含有main(String[])方法可以运行任何Groovy脚本.你可以用下面的语句执行任何Groovy脚本:
java groovy.lang.GroovyShellfoo/MyScript.groovy [arguments
你可以在你的IDE中使用上面的Groovymain()执行或调试任何Groovy脚本.
3.用命令行执行Groovy脚本
在GROOVY_HOMEbin里有个叫'groovy' 或'groovy.bat' 的脚本文件(或者二者都有,根据你的平台不同而不同).这些脚本文件是Groovy运行时的一部分.
一旦安装了Groovy运行时,你就可以这样运行Groovy脚本:
groovyfoo/MyScript.groovy[arguments]
如果你使用从CVS构建的Groovy,那么除了Groovy脚本以外,命令行上可能还运行着其他的类.
1.拥有main()方法的类;
2.和JUnit的测试一起运行的继承自GroovyTestCase的类,
3.实现Runnable接口的类.run()方法被调用.
获得最新最强的Groovy,输入下面的命令做一个CVS检出
mavengroovy:make-install
在groovy/target/install里会有一份完整的二进制分发包.你可以将groovy/target/install/bin添加到你的路径,这样你就可以轻松地用命令行执行你的Groovy脚本了.
4.用Groovy创建Unix脚本
你可以用Groovy编写Unix脚本并且像Unix脚本一样直接从命令行运行它.倘若你安装的是二进制分发包并且设置好了路径,那么下面的代码将会很好的工作:
将其保存为helloWorld.groovy.
#!/usr/bin/envgroovy
println("Helloworld")
for(ainthis.args){
println("Argument:"+a)
}
接着从命令行运行这个脚本,
chmod+xhelloWorld
./helloWorld