走进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 ...
随机推荐
- memset memcpy函数
memset 函数 1.其头文件为: #include<memory> 或者#include<string> 2.原型 看清是对每个字节,不是其类型 void *mems ...
- Java学习之道:Java项目打包发布
Java项目打包发布 如果只想发布为一个可执行的jar包,使用eclipse的Export功能就可以了 使用eclipse的Export功能,将项目中的所有package打包为一个pet.jar文件, ...
- linux使用工具记录
linux工具查询手册: http://linuxtools-rst.readthedocs.io/zh_CN/latest/index.html
- atoi函数和atof函数
1.函数名:atoi 功能:是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中 名字来源:alphanumeric to integer 用法:int atoi(const char *n ...
- MySQLdb的安装
第一步:下载安装介质 https://pypi.python.org/pypi/MySQL-python 注意虽然模块名叫MySQLdb但是MySQL-python指的就是MySQLdb 第二步:安装 ...
- CDC不同模式在ODI体现系列之二 异步模式
CDC不同模式在ODI体现系列之二 异步模式 2 异步模式需要在数据库中做一些准备工作: 改数据为归档并启用logminer: SQL> shutdown immediate 数据库已经关闭. ...
- 1.9 需求订单导入MDS
1.9 需求订单导入MDS 1.9.1 业务方案描述 将”需求订单维护表”中完成调整维护的需求订单导入系统标准MDS中,使之驱动对应的物料需求计划(MRP)的运行. 1.9.2 ...
- JavaEE Tutorials (19) - Web应用安全入门
19.1Web应用安全概述29519.2保护Web应用安全296 19.2.1指定安全约束297 19.2.2指定认证机制300 19.2.3在部署描述文件中指定认证机制302 19.2.4声明安全角 ...
- 将外部准备好的sqlite导入到项目当中
首先,将sqlite数据库文件放在Resource文件夹下,并且允许其编译到项目当中. 之后在AppDelegate当中执行一些代码,这里将代码封装了一个Helper: #import "R ...
- icon
<link rel="icon" href="favicon.ico" type="image/x-icon"> <lin ...