承接上一篇,配置好环境后,开始正式学习语法。我假设看此文的同窗至少会必定的JAVA语法,所以一些太过基础的就不记录了,基本上,你们看看示例就明白了。java
Groovy的卖点之一,就是全兼容JAVA的语法,所以你彻底能够从一个JAVA文件中把源代码复制到一个Groovy文件中而没必要改写任何一个字直接运行,不过这样在groovy中写JAVA就没意思了,享受不到groovy带来的乐趣了。数组
一个groovy文件,并不是像java文件同样,必需要定义一个类且文件名必须和类名同样,groovy文件中,你能够同时定义好几个类,也能够没有类,像这样:闭包
println("hello groovy")
println "hello world"
能够看到groovy对于代码要求比较宽松,能够没有分号,能够没有函数调用时的括号。函数
当groovy引用JAVA类时,groovy自动会导入java.lang,java.util,java.io,java.net以及BigDecimal、BigInteger两个类,以及一些groovy包。学习
直接上代码吧spa
//输出从1到10,后面的是闭包,若是只有一个参数,而且没指定参数名的话,默认名就是it 1.upto(10) { println it } //从10到1 10.downto(1) { println it } //循环10次 10.times { println it } //至关 for(int i=0;i<10;i+=3) 0.step(10,3) { println it } //只有当实例不为null时才调用方法 String str = null println str?.toUpperCase() //groovy对于异常比较宽松,能够不处理异常,异常发生时会抛给调用者 Thread.sleep(10) //不用必定要处理异常
class Book{ //能够指定类型,若是是给JAVA调用的,仍是指定类型的好 String name //不指定类型 def price def String toString(){ "$name : $price" } }
看看在JAVA中调用这个类的状况:.net
能够看到,groovy自动生成的getter和setter方法,只是若是没有指定类型的话,类型默认是Object类型。code
//具名参数,这要求类有无参构造函数 //至关于创建实例后,初始化各属性 //具名参数比较灵活,特别是传入map的时候,有需求的同窗本身查一下 def book = new Book(price:20.5, name:'Groovy Book') println book //默认参数(可选参数) //可选参数必须位于参数最后边 def say(txt,t=5){ t.times { println txt } } //默认显示5次 say 'hello' //显示3次 say 'world', 3 //返回多值 def mult(){ [1,3] //把要返回的多个值放于数组中 } //直接把数组分拆,赋值给a和b //若是返回的值多于变量,则丢弃多余值 //若是返回的值少于变量,则其他变量为null def (a,b) = mult() println a println b
grovvy中不要求实现全部接口方法,若是那些方法用不到的话,彻底能够不实现。同时,只要参数一致,groovy中的代码块能够转成任意接口。blog
List<Integer> list = new ArrayList<Integer>() list.add(1) list.add(3) list.add(7) list.add(4) //直接实现 list.sort({a,b-> a <=> b //飞船操做符 :) }) for(x in list) println x //实现有多个方法的接口 interface Action{ void eat(); void drink(); } def action = [ eat: {println "amu amu" }, drink: {println "gudu gudu" } ] //定义调用接口的方法 def callAction(Action act){ act.eat() act.drink() } callAction( action as Action )
五. 布尔转换接口
在JAVA中,只有true和false两种布尔值,在groovy中,则什么类型均可以转换为布尔值,具体转换以下:
类型 | 为true的条件 |
Boolean | 值为true |
Collection | 集合不为空 |
Character | 值不为0 |
CharSequence | 长度大于0 |
Enumeration | hasMoreElements()为true |
Iterator | hasNext()为true |
Number | 值不为0 |
Map | 不为空 |
Matcher | 至少一个匹配 |
数组 | 长度大于0 |
其余类型 | 引用不为null |
在本身类中,若是实现asBoolean()方法,则能够本身控制如何转化为boolean
//通常来讲,若是引用不为null则为true //可是实现了asBoolean方法的话,则按照该方法返回值 class MyBoolean{ def asBoolean(){ false } } def b = new MyBoolean() println b ? "true" : "false" //false