走进Groovy (二)
承接上一篇,配置好环境后,开始正式学习语法。我假设看此文的同学至少会一定的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 (二)的更多相关文章
- 走进Groovy (一)
一直很喜欢脚本语言,但是一直在不大的公司工作,用得一直是“高大上”的JAVA语言,在真正的项目中,没什么机会用到脚本语言.这两年,又断断续续的用了2年的Ruby,再回头继续用JAVA,说实话,真感觉J ...
- 走进AngularJs(二) ng模板中常用指令的使用方式
通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的.ng的模板真是让我爱不释手.学习ng道路还很漫长,从模板 ...
- 走进JDK(二)------String
本文基于java8. 基本概念: Jvm 内存中 String 的表示是采用 unicode 编码 UTF-8 是 Unicode 的实现方式之一 一.String定义 public final cl ...
- 云计算之走进LINUX(二)
引言 * 第二部分 云计算应用管理 [Shell脚本基础] [使用变量] [条件测试及选择] [列表式循环] [系统安全保护] [配置用户环境] [防火墙策略管理] [ISCSI共享存储] [数据库 ...
- 深入理解java虚拟机(一)-----java内存区域以及内存溢出异常
概述 Java语言的一个非常重要的特点就是与平台的无关性.而使用Java虚拟机是实现这一特点的关键.一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码.而引入Java语言虚拟机后,J ...
- 小丁带你走进git的世界二-工作区暂存区分支
小丁带你走进git的世界二-工作区暂存区分支 一.Git基本工作流程 1.初始化一个仓库 git init git clone git仓库分为两种情况: 第一种是在现有项目或目录下导入所有文件到 ...
- Groovy学习笔记(二)
在上一篇文章中我们主要学习了如何搭建Groovy开发环境,为我们的Groovy之旅做好了准备工作,不知道你是否准备好了?接下来我们就一起看看Groovy与我们熟悉的Java有什么异同. Groovy是 ...
- Android自由行之走进zxing,轻松实现二维码扫描
现在很多App都集成了扫一扫功能,最常用的微信.QQ.手机助手等.二维码也使得生活变得更加简洁,扫一扫订餐.扫一扫下载等等.那么,说到二维码,我们不得不提Google一个开源的扫码框架:zxing. ...
- 走进JDK(十二)------TreeMap
一.类定义 TreeMap的类结构: public class TreeMap<K,V> extends AbstractMap<K,V> implements Navigab ...
随机推荐
- doGet与doPost的区别
转自:http://blog.csdn.net/luoweifu/article/details/7865243 目录(?)[-] 不同点一 不同点二 输入表单inputhtml Serlvlet ...
- 基于php常用正则表达整理(下)
61 \n 匹配一个换行符.等价于 \x0a 和 \cJ.62 \r 匹配一个回车符.等价于 \x0d 和 \cM.63 \s 匹配任何空白字符,包括空格.制 ...
- C语言处理CSV文件的方法(二)
strtok函数的使用是一个老生常谈的问题了.该函数的作用很大,争议也很大.以下的表述可能与一些资料有区别或者说与你原来的认识有差异,因此,我尽量以实验为证.交代一下实验环境是必要的,win7+vc6 ...
- Linux学习之head命令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾. 1.命令格式: hea ...
- Android 动画系列
Android种最常用的动画: ~1~Tween动画,就是对场景里的对象不断的进行图像变化来产生动画效果(旋转.平移.放缩和渐变) Tweene Animations 主要类: Animation ...
- Android 三星手机不能调起应用市场
Uri uri; if (hasAnyMarketInstalled(getContext())) { uri = Uri.parse("market://details?id=" ...
- css3之border-color
-moz-border-top-colors:上边框-moz-border-right-colors:右边框-moz-border-bottom-colors:下边框-moz-border-left- ...
- php中如何输出当前服务器的(中国)当前时间
date_default_timezone_set('PRC');//PRC是什么?PRC是中华人民共和国啊-_- echo "今天是".date("Y年m月d日&quo ...
- C++设计模式之建造模式
#include <iostream>using namespace std; class ApplePhone { public: virtual void buildCamera()= ...
- ThinkPHP中ajax提交数据
最近在做项目时遇到了一些需要从页面用ajax提交数据到后台的操作,无奈本人技术有限,网上苦寻,研究了一下ajax和thinkPHP的结合,黄天不负苦心人,终于搞定了. 闲话少叙,进入正题:我需要从页面 ...