承接上一篇,配置好环境后,开始正式学习语法。我假设看此文的同学至少会一定的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包。

一. 一些杂项的语法扩展

直接上代码吧

//输出从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中调用这个类的情况:

可以看到,groovy自动生成的getter和setter方法,只是如果没有指定类型的话,类型默认是Object类型。

三. 参数及返回值

  • 具名变量:灵活的初始化
  • 可选参数:方法的默认值
  • 多赋值:一次赋值多个变量
//具名参数,这要求类有无参构造函数
//相当于建立实例后,初始化各属性
//具名参数比较灵活,特别是传入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中的代码块可以转成任意接口。

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

走进Groovy (二)的更多相关文章

  1. 走进Groovy (一)

    一直很喜欢脚本语言,但是一直在不大的公司工作,用得一直是“高大上”的JAVA语言,在真正的项目中,没什么机会用到脚本语言.这两年,又断断续续的用了2年的Ruby,再回头继续用JAVA,说实话,真感觉J ...

  2. 走进AngularJs(二) ng模板中常用指令的使用方式

    通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板 ...

  3. 走进JDK(二)------String

    本文基于java8. 基本概念: Jvm 内存中 String 的表示是采用 unicode 编码 UTF-8 是 Unicode 的实现方式之一 一.String定义 public final cl ...

  4. 云计算之走进LINUX(二)

    引言 * 第二部分  云计算应用管理 [Shell脚本基础] [使用变量] [条件测试及选择] [列表式循环] [系统安全保护] [配置用户环境] [防火墙策略管理] [ISCSI共享存储] [数据库 ...

  5. 深入理解java虚拟机(一)-----java内存区域以及内存溢出异常

    概述 Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,J ...

  6. 小丁带你走进git的世界二-工作区暂存区分支

    小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git  init git  clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...

  7. Groovy学习笔记(二)

    在上一篇文章中我们主要学习了如何搭建Groovy开发环境,为我们的Groovy之旅做好了准备工作,不知道你是否准备好了?接下来我们就一起看看Groovy与我们熟悉的Java有什么异同. Groovy是 ...

  8. Android自由行之走进zxing,轻松实现二维码扫描

    现在很多App都集成了扫一扫功能,最常用的微信.QQ.手机助手等.二维码也使得生活变得更加简洁,扫一扫订餐.扫一扫下载等等.那么,说到二维码,我们不得不提Google一个开源的扫码框架:zxing. ...

  9. 走进JDK(十二)------TreeMap

    一.类定义 TreeMap的类结构: public class TreeMap<K,V> extends AbstractMap<K,V> implements Navigab ...

随机推荐

  1. QF——UI之几种常用的隐藏键盘的方法

    怎么在填写完UITextField之后,点击空白处,隐藏软键盘. 下面两个方法都可以隐藏键盘 [tf resignFirstResponder]; 停止textfield的第一响应者 [self.vi ...

  2. SVN版本控制服务器安装与配置

    版本管理在我们日常学习中一般接触不到,因为我们都是一个人在学习与开发一些练习的项目.但是实际中,一般项目都是协同开发的,这样就需要一个版本管理工具,常见的有SVN/CVS/GitHut等...通过它们 ...

  3. xHTML+div布局:三个div,两边div宽度固定,中间div宽度自适应

    xHTML+div经常考题:三个div,两边div宽度固定,中间div宽度自适应. 和大家分享一个实现方式: 1.html代码 <div class="dyleft"> ...

  4. JS一些小算术、1加到50、乘法口诀表、买鸡等

    //从1加到50 for (var a=1,i=0;a<51; a++) {i=a+i} document.write(i);//1加到50 var num=0; for(var i=1;i&l ...

  5. XML实例入门2

    工具:notepad++.VS2008(MSXML6.0) 来自msdn的例子(经过修改,因为升级到MSXML6.0,有些关键字不太一样了), 需要文件books.xml,books.vsd(博客只支 ...

  6. myeclipse 环境配置优化,不断跟新整理中

    myeclipse 环境配置,不断跟新整理中1.General --->Workspace ---> UTF-8 工作环境编码2.General --->Editors --> ...

  7. ubuntu下编译内核驱动。

    目的: 1. 驱动热身.网上有很多类似的文章可供参考. 2. 在操作系统中, 编写这个设备的驱动. 3. 为写qemu的watchdog驱动练手. 有朋友问make的 watchdog驱动 需要什么准 ...

  8. Linux-VPN安装配置方法

    VNP服务器IP地址为:192.168.6.6 一.编译安装:   注意:可能需要ppp.libcap.libcap-devel ncurses-devel RPM 包支持,如果没有请安装 libca ...

  9. Cookie、Session

    Cookie.Session Cookie 保存在浏览器端. 4kb 只能保存字符串,还不能是中文. 获取:Request.getCookies(); 设置时间:setMaxAge(); 小于零是浏览 ...

  10. android-supporting-multiple-devices

    There are a few common questions asked whenever development begins on a new Android app. What assets ...