走进Groovy (二)

承接上一篇,配置好环境后,开始正式学习语法。我假设看此文的同窗至少会必定的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)  //不用必定要处理异常

 

二. 类定义及方法

  • 类和方法默认是public
  • 能够没有return,最后一项的值就是返回值
  • 用def申请属性及方法,能够不带类型
class Book{
    //能够指定类型,若是是给JAVA调用的,仍是指定类型的好
    String name
    //不指定类型
    def price
    
    def String toString(){
        "$name : $price"
    }
}

看看在JAVA中调用这个类的状况:.net

image

能够看到,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
相关文章
相关标签/搜索