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

    memset 函数 1.其头文件为: #include<memory> 或者#include<string> 2.原型    看清是对每个字节,不是其类型 void *mems ...

  2. Java学习之道:Java项目打包发布

    Java项目打包发布 如果只想发布为一个可执行的jar包,使用eclipse的Export功能就可以了 使用eclipse的Export功能,将项目中的所有package打包为一个pet.jar文件, ...

  3. linux使用工具记录

    linux工具查询手册: http://linuxtools-rst.readthedocs.io/zh_CN/latest/index.html

  4. atoi函数和atof函数

    1.函数名:atoi 功能:是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中 名字来源:alphanumeric to integer 用法:int atoi(const char *n ...

  5. MySQLdb的安装

    第一步:下载安装介质 https://pypi.python.org/pypi/MySQL-python 注意虽然模块名叫MySQLdb但是MySQL-python指的就是MySQLdb 第二步:安装 ...

  6. CDC不同模式在ODI体现系列之二 异步模式

    CDC不同模式在ODI体现系列之二 异步模式 2 异步模式需要在数据库中做一些准备工作: 改数据为归档并启用logminer: SQL> shutdown immediate 数据库已经关闭. ...

  7. 1.9 需求订单导入MDS

    1.9          需求订单导入MDS 1.9.1   业务方案描述 将”需求订单维护表”中完成调整维护的需求订单导入系统标准MDS中,使之驱动对应的物料需求计划(MRP)的运行. 1.9.2  ...

  8. 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声明安全角 ...

  9. 将外部准备好的sqlite导入到项目当中

    首先,将sqlite数据库文件放在Resource文件夹下,并且允许其编译到项目当中. 之后在AppDelegate当中执行一些代码,这里将代码封装了一个Helper: #import "R ...

  10. icon

    <link rel="icon" href="favicon.ico" type="image/x-icon"> <lin ...