groovy用户指南.doc_第1页
groovy用户指南.doc_第2页
groovy用户指南.doc_第3页
groovy用户指南.doc_第4页
groovy用户指南.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

集合(1)List (java.util.List)list = 1, 2, hello, new java.util.Date()assert list.size() = 4assert list.get(2) = hello注意:一切都是对象(数字会自动转换)(2)Map (java.util.Map)map = name:James, location:Londonassert map.size() = 2assert map.get(name) = James(3)遍历集合list = 1, 2, 3for (i in list) println i 2、 闭包(Closures)l 闭包类似Java的内类,区别是闭包只有单一的方法可以调用,但可以有任意的参数closure = param - println(hello $param) closure.call(world!)closure = greeting, name - println(greeting + name) closure.call(hello , world!)l 闭包用“”括起,“-”前面是参数,后面是处理语句,使用call调用l 第一个例子演示了在字符串内使用参数的形式:$param l 第二个例子演示了多参数形式:用“,”分隔参数l 如果只有一个参数,可以不写,而使用缺省的参数“it”,如下面的例子:closure = println hello + it closure.call(world!)3、 eachl 遍历集合,逐个传递给闭包1, 2, 3.each item - print $item- l 上面例子的输出结果是:1-2-3-4、 collectl 遍历集合,逐个传递给闭包,处理后的结果返回给对应的项value = 1, 2, 3.collect it * 2 assert value = 2, 4, 6与each区别:value2 = 1, 2, 3.each it * 2 println value2value3 = 1, 2, 3.collect it * 2 println value3结果:1, 2, 32, 4, 6返回值不同5、 findl 根据闭包断言,返回集合中找到的第一个项目value = 1, 2, 3.find it 1 assert value = 26、 findAlll 根据闭包断言,返回集合中所有找到的项目value = 1, 2, 3.findAll it 1 assert value = 2, 37、 injectl 遍历集合,第一次将传递的值和集合项目传给闭包,将处理结果作为传递的值,和下一个集合项目传给闭包,依此类推value = 1, 2, 3.inject(counting: ) str, item - str + item assert value = counting: 123value = 1, 2, 3.inject(0) count, item - count + item assert value = 68、 everyl 如果集合中所有项目都匹配闭包断言,就返回true,否则返回falsevalue = 1, 2, 3.every it item 2 assert valuevalue = 1, 2, 3.any item | item 3 assert value = false10、 min/maxl 返回集合中的最小/最大项目(对象必须可比较)value = 9, 4, 2, 10, 5.max()assert value = 10value = 9, 4, 2, 10, 5.min()assert value = 2value = x, y, a, z.min()assert value = a11、 joinl 连接集合中的值成一个字符串value = 1, 2, 3.join(-)assert value = 1-2-312、 yieldl 在Python和Ruby中通过yield语句创建“yield”风格的iterators,在Groovy同样有效,只是使用的是闭包class Foostatic void main(args) foo = new Foo()for (x in foo.myGenerator) print($x-)myGenerator(Closure yield) yield.call(A)yield.call(B)yield.call(C)l 例子的输出结果是:A-B-C-l Cloures原型可以省略,call和括号同样可选,这样更象Python/Rubyclass Foo myGenerator(yield) yield Ayield Byield C static void main(args) foo = new Foo()foo.myGenerator println Called with $it 1.闭包先解释一下闭包的概念:闭包是很多动态语言提供的一个很方便的功能,它有点像Java中的内部类,不同的是闭包中只有一个方法,但这个方法可以有任意个参数。下面看一个闭包的最简单的例子:def closure= param - println hello $param closure.call(world!)def是一个关键字,相当于JavaScript中的Var,用来定义一个对象。closure为闭包的名字。在大括号里面,参数和处理参数的语句用-隔开。param是这个闭包的参数,参数的数目是任意的,不同的参数之间用,隔开。下面处理这些参数的语句就可以直接调用这些参数了。所有的闭包都是继承自groovy.lang.Closure类,闭包也是一个普通的类,只是在Groovy中,这个语法比较特别。所以闭包也可以当作一个返回值。或者当作一个参数传入一个方法。闭包的返回值:调用闭包的call方法,会有一个返回值,可以调用return来指定,如果不指定的话,则返回闭包中最后一条有返回值的语句。闭包可以调用的对象:在方法里面,可以调用方法内的局部变量作为类变量,可以调用类变量关于0个参数以及对象it:参数可以是任意个,没有参数就不需要-了。没有参数的话,但是传入了一个参数,这个参数可以通过一个无类型的对象it来访问。比如上面的例子我们可以这么写:def closure2= println hello $it closure2.call(world!)关于闭包的调用:定义以后就可以调用这个闭包,有两种方式,closure.call(world!)closure(world!)这两种是没有任何区别的,第二个是第一个的简写2.集合的本地化语法这个比闭包更容易理解,Groovy对collections, lists, maps, arrays的声明和使用提供了语言级的支持,可以直接声明一个list和map,无需调用new方法创建一个List或者map对象。看一个来自Groovy官方网站的例子:def list = 5, 6, 7, 8assert list.get(2) = 7assert list2 = 7assert list instanceof java.util.Listdef emptyList = assert emptyList.size() = 0emptyList.add(5)assert emptyList.size() = 1与Java的区别如下:1.通过value.的方式来声明2.通过listindex的方式来访问和赋值3.通过来声明一个空的map看一个Map的例子:def map = name:Gromit, likes:cheese, id:1234assert map.get(name) = Gromitassert map.get(id) = 1234assert mapname = Gromitassert mapid = 1234assert map instanceof java.util.Mapdef emptyMap = :assert emptyMap.size() = 0emptyMap.put(foo, 5)assert emptyMap.size() = 1assert emptyMap.get(foo) = 5与Java的区别如下:1.通过name:value.的方式来声明2.通过mapname的方式来访问和赋值3.通过的方式来访问和赋值4.通过:来声明一个空的mapRange的使用:Range是Groovy新添的一个集合类,继承自java.util.List,所以可以像使用List一样使用。下面是关于Range的一个例子:def range = 5.8assert range.size() = 4assert range.get(2) = 7assert range2 = 7assert range instanceof java.util.Listassert range.contains(5)assert range.contains(8)range = 5.8assert range.size() = 3assert range.get(2) = 7assert range2 = 7assert range instanceof java.util.Listassert range.contains(5)assert ! range.contains(8)几个说明1.Range的类型可以是int、char2.通过min.max来声明3.可以像其他集合一样使用*.操作符号的使用:可以用来使集合中的所有元素都调用同一个方法,返回一个同等size的ListList list = Rod, Phil, James, Chrisprintln list*.size()String的特殊使用:String在Groovy中可以像char数组一样的使用,下面是一个例子:def text = nice cheese gromit!def x = text2assert x = cassert x.class = Stringdef sub = text5.10assert sub = cheese说明:1.通过textindex的方式返回在index处的字符,不过返回的是string类型的,非char类型2.通过textmin.max方式来返回子字符串,包含max处的字符,String的subString不包含。3.从这个例子中可以看到,可以使用string来表示String,不一定是string-1、类(1)类l Groovy的类定义和Java类似 方法可以基于类(static)或实例 可以为public、protected或private 支持常用的Java修饰符,如synchronizedl Groovy的不同地方:缺省是publicl Groovy支持JavaBean机制:GroovyBeanl 每个Groovy类都是字节码/JVM级的Java类,任何方法对Java都是有效的,反之亦然l 你可以指定方法的参数类型和返回类型,这样可以在通常的Java代码中更好的工作l 你可以用上面的方式来实现接口或重载方法l 如果省略方法的类型,就会使用缺省的java.lang.Object(2)脚本l Groovy支持纯脚本,而不需要声明类,如Foo.groovy包含下面的脚本:println Nice cheese Gromit!l 运行脚本的过程: 编译成Foo.class(还会有一些内类),该类扩展groovy.lang.Script 执行自动生成的main方法 实例化Foo类 调用run方法执行脚本内容l 可以在Java代码中执行脚本,同时还可以传递变量值到脚本中l Foo.groovy内容修改如下println Nice $cheese Gromit!l 下面是执行脚本的UseFoo类import groovy.lang.Binding;import groovy.lang.Script;public class UseFoo public static void main(String args) Binding binding = new Binding();binding.setVariable(cheese, Cheddar);Script foo = new Foo(binding);foo.run();l UseFoo运行的结果是:Nice Cheddar Gromit!l 执行脚本的方法是创建Foo类实例,调用其run方法l Foo类有一个带Binding参数的构造函数,可以通过Binding类的setVariable方法设置值给脚本中的属性变量l Foo类有一个不带参数的构造函数,在不传递属性变量值时使用l 在脚本结束后,脚本中创建的任何变量都会在Binding中,以供在Java中访问l 再将Foo.groovy内容修改如下println Nice $cheese Gromit!cheese = changedl UseFoo类修改为:import groovy.lang.Binding;import groovy.lang.Script;public class UseFoo public static void main(String args) Binding binding = new Binding();binding.setVariable(cheese, Cheddar);Script foo = new Foo(binding);foo.run();println binding.getVariable(cheese);l UseFoo运行的结果是:Nice Cheddar Gromit!changed(3)脚本中的函数l 不同于基于Class的Groovy,纯脚本中的函数用def关键字声明def foo(list, value) println Calling function foo() with param $value list println(Hello $a $b $c) c(cheese, 234, gromit)l 下面是另一个使用两个参数的有用例子,在Groovy快速入门已经讲过:value = 1, 2, 3.inject(counting: ) str, item str + item assert value = counting: 123value = 1, 2, 3.inject(0) count, item - count + item assert value = 63、集合Groovy支持集合、List、Map和数组(1)Listsl 下面是创建List的例子,表示空List表达式list = 5, 6, 7, 8assert list.get(2) = 7assert list instanceof java.util.ListemptyList = assert emptyList.size() = 0emptyList.add(5)assert emptyList.size() = 1l 每个List表达式都是java.util.List的实现(2)范围(Ranges)l Range允许创建连续值的列表l 由于Range扩展java.util.List,所以Range可以作为List使用l 使用.的Range是包括两个边界,使用.的Range只包括开始边界,而不包括结束边界(/我在groovy1.5中不能使用.,如果想建立不包括边界的范围,可以使用 range=5.8)/ an inclusive rangerange = 5.8assert range.size() = 4assert range.get(2) = 7assert range instanceof java.util.Listassert range.contains(5)assert range.contains(8)/ lets use an exclusive rangerange = 5.8assert range.size() = 3assert range.get(2) = 7assert range instanceof java.util.Listassert range.contains(5)assert ! range.contains(8)/我在groovy1.5中不能使用.,如果想建立不包括边界的范围,可以使用如下range=5.8l Range可以用于实现java.lang.Comparable的Java对象/ an inclusive rangerange = a.dassert range.size() = 4assert range.get(2) = cassert range instanceof java.util.Listassert range.contains(a)assert range.contains(d)assert ! range.contains(e)l Range可以用于循环遍历for (i in 1.10) println Hello $i(3)Mapsl 下面是创建Map的例子,:表示空Map表达式map = name:Gromit, likes:cheese, id:1234assert map.get(name) = Gromitassert map.get(id) = 1234assert map instanceof java.util.MapemptyMap = :assert emptyMap.size() = 0emptyMap.put(5, foo)assert emptyMap.size() = 1assert emptyMap.get(5) = fool Map可以象beans一样操作,但key值(类似属性名)必须为有效的String标识map = name:Gromit, likes:cheese, id:1234assert = Gromitassert map.id = 1234emptyMap = :assert emptyMap.size() = 0emptyMap.foo = 5assert emptyMap.size() = 1assert emptyMap.foo = 5(4)使用下标操作符l 可以在字符串、Lists、Maps.中使用下标进行索引text = nice cheese gromit!x = text2assert x = cassert x.class = Stringsub = text5.10assert sub = cheesemap = name:Gromit, likes:cheese, id:1234assert mapname = Gromitlist = 10, 11, 12answer = list2assert answer = 12list = 100.200sub = list1, 3, 20.25, 33assert sub = 101, 103, 120, 121, 122, 123, 124, 125, 133l 可以使用下标操作符更新项目list = a, b, clist2 = dlist0 = list1list3 = 5assert list = b, b, d, 5l 可以使用负索引从最后开始计数text = nice cheese gromit!x = text-1assert x = !name = text-7.-2assert name = gromitl 也可以使用向后范围(开始索引大于结束索引),返回的结果是反转的text = nice cheese gromit!name = text3.1assert name = eci4、与Java的不同(1)通用l 在Groovy中,=等价于equals(),=意味着标识比较(等同Java中的=)好像没有这个操作符=l 在Java中=意味着原类型的相等和对象的标识比较,如a=b(a和b是指向相同对象的引用)l 传递闭包给方法或使用GroovyMarkup时,要和方法的调用在同一行上,如:(本人尝试不在同一行也可,但建议遵守要求)1, 2, 3.each println it l 如果要将放在独立于方法的一行上,要使用括号()1, 2, 3.each ( println it )l 下面的写法是无效的,会将闭包解释成独立的闭包,而不会将闭包作为方法的参数传递1, 2, 3.each println it (2)应该意识到的事情l 语句后面的分号是可选的,但在同一行上有多个语句需要用分号分隔l return关键字可选l 可以在static方法内使用_this_关键字(何用?)l 缺省的修饰符是publicl Groovy中的protected等价包的protected和Java的protectedl 补充:方法调用时,括号是可选的,(注意最好使用括号,以防止错误)(3)在Java中无效的Groovy新特性l 闭包l List和Map的本地语法l GroovyMarkup和Gpath的支持l 正则表达式的本地支持l 多形式的iteration和强大的switch语句l 动态和静态类型的支持l 在字符串中嵌入表达式l 增加了许多新的帮助方法l 在属性和添加事件侦听方面,简化了编写bean的语法5、Groovy Mathl Groovy支持访问所有的Java Math类和操作l 为了使math操作在脚本编写时尽可能直观,Groovy math模型支持文字化math操作l 缺省计算使用的是精确的小数(BigDecimal),如:1.1 + 0.1 = 1.2返回的是true,而不是false(不象在Java中使用float或double)(1)数字的文字表示l Groovy的小数文字表示是java.math.BigDecimal的实例,而不是浮点类型(Float或Double)l Float和Double可以使用后面讲的后缀(F和D)方法来创建l 小数的指数形式也支持,如12.3e-23l 十六进制和八进制也支持,十六进制前缀0x,八进制前缀0l 整数类型可以使用后面讲的后缀(I、L和G)方法来创建,如果不指定根据数值的大小使用合适的类型l 数字类型的后缀文字表示_Type_Suffix_BigInteger_G_Long_L_Integer_I_BigDecimal_(缺省)_Double_D_Float_Fl 例子:assert 42I = newInteger(42);assert 123L = newLong(123);assert 2147483648 = newLong(2147483648); /Long type used, value too large for an Integerassert 456G = new java.math.BigInteger(456);assert 123.45 = new java.math.BigDecimal(123.45); /default BigDecimal type usedassert 1.200065D = newDouble(1.200065);assert 1.234F = newFloat(1.234);assert 1.23E23D = newDouble(1.23E23);(2)Math操作l Groovy的Math实现很接近Java 1.5 BigDecimal Math模型的实践l Java.lang.Number包括其子类的二元操作(除了除法)会根据下表自动转换参数类型_BigDecimal_BigInteger_Double_Float_Long_Integer_BigDecimal_BigDecimalBigDecimalDoubleDoubleBigDecimalBigDecimal_BigInteger_BigDecimalBigIntegerDoubleDoubleBigIntegerBigInteger_Double_DoubleDoubleDoubleDoubleDoubleDouble_Float_DoubleDoubleDoubleDoubleDoubleDouble_Long_BigDecimalBigIntegerDoubleDoubleLongLong_Integer_BigDecimalBigIntegerDoubleDoubleLongIntegerl 注意:Byte、Character、Short都作为Integer类型(3)除法l 除法操作“/”和“/=”在操作数中有Float或Double类型时,结果为Double类型;其它情况,结果为BigDecimal类型l BigDecimal类型的操作会这样做:BigDecimal.divide(BigDecimal right, , BigDecimal.ROUND_HALF_UP)其中是MAX(this.scale(), right.scale(), 10)l 例子:1/2 = new java.math.BigDecimal(0.5);1/3 = new java.math.BigDecimal(0.3333333333);2/3 = new java.math.BigDecimal(0.6666666667);l 整型除法使用“”和“=”操作,返回整型类型l 由于“”是Java中的转义符,在字符串中使用需要转义 x = 83 (4)数字文字表示语法IntegerLiteral: Base10IntegerLiteral HexIntegerLiteral OctalIntegerLiteral Base10IntegerLiteral: Base10Numeral IntegerTypeSuffix (optional) HexIntegerLiteral: HexNumeral IntegerTypeSuffix (optional) OctalIntegerLiteral:OctalNumeral IntegerTypeSuffix (optional) IntegerTypeSuffix: one of i I l L g GBase10Numeral: 0 NonZeroDigit Digits (optional) Digits: DigitDigits Digit Digit: 0NonZeroDigitNonZeroDigit: one of1 2 3 4 5 6 7 8 9HexNumeral:0 x HexDigits0 X HexDigitsHexDigits:HexDigitHexDigit HexDigitsHexDigit: one of0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E FOctalNumeral:0 OctalDigitsOctalDigits:OctalDigitOctalDigit OctalDigitsOctalDigit: one of0 1 2 3 4 5 6 7DecimalPointLiteral:Digits . Digits ExponentPart (optional) DecimalTypeSuffix (optional). Digits ExponentPart (optional) DecimalTypeSuffix (optional)Digits ExponentPart DecimalTypeSuffix (optional)Digits ExponentPart (optional) DecimalTypeSuffix (optional) ExponentPart:ExponentIndicator SignedIntegerExponentIndicator: one ofe ESignedInteger:Signopt DigitsSign: one of+ -DecimalTypeSuffix: one off F d D g G6、I/Ol Groovy提供许多有用的方法来处理I/O,包括标准的Java Reader/Writer、InputStream/OutputStream、File和URL类l 使用闭包允许处理资源时确保正确关闭而不管是否有异常,例如下面的例子遍历文件的每一行,即使闭包中发生异常,文件也能正确关闭:import java.io.Filenew File(foo.txt).eachLine println it l 使用Reader/Writer:通过闭包处理资源import java.io.Filenew File(foo.txt).withReader reader - while (true) line = reader.readLine().l Groovy提供简单的方法执行命令行进程,表达式返回java.lang.Process实例,具有in/out/err流(译者:没有测试过)process = ls -l.execute()process.in.eachLine line | println line 7、逻辑分支(1)if-else语句l Groovy提供Java相同的if-else语句x = falsey = falseif ( !x ) x = trueassert x = trueif ( x ) x = false else y = trueassert x = yl Groovy也支持三元操作符y = 5x = (y 1) ? worked : failedassert x = worked(2)switch语句l Groovy的switch语句兼容Java代码,不同之处在于Groovy的switch语句能够处理各种类型的switch值,可以做各种类型的匹配:类名,正则,集合,值。 case值为类名匹配switch值为类实例,可为变量,动态 case值为正则表达式匹配switch值的字符串匹配该正则表达式 case值为集合匹配switch值包含在集合中,这包括ranges 除了上面的,case值与switch值相等才匹配x = 1.23result = switch ( x ) case foo: result = found foo case bar: result += bar case 4, 5, 6, inList: result = list break case 12.30: result = range break caseInteger: result = integer break caseNumber: result = number break default: result = defaultassert result = numberl switch语句的工作原理:switch语句在做匹配case值时调用isCase(switchValue)方法,缺省调用equals(switchValue),但是已经被重载成各种类型,如类,正则表达式、集合等等l 可以创建自定义的匹配类,增加isCase(switchValue)方法来提供自定义的匹配类型8、循环(1)while和do 循环l Groovy支持Java相同的while和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论