1.什么是groovy?
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。
Groovy是一种基于Java平台的面向对象语言。 Groovy 1.0于2007年1月2日发布,其中Groovy 2.4是当前的主要版本。 Groovy通过Apache License v 2.0发布。
目前最新版本为2.5.3。
2.Groovy的特点
Groovy中有以下特点:
- 同时支持静态和动态类型
- 支持运算符重载
- 本地语法列表和关联数组
- 对正则表达式的本地支持
- 各种标记语言,如XML和HTML原生支持
- Groovy对于Java开发人员来说很简单,因为Java和Groovy的语法非常相似
- 您可以使用现有的Java库
- Groovy扩展了java.lang.Object
动态类型
类型对于变量,属性,方法,闭包的参数以及方法的返回类型都是可有可无的,都是在给变量赋值的时候才决定它的类型, 不同的类型会在后面用到,任何类型都可以被使用,即使是基本类型 (通过自动包装(autoboxing)). 当需要时,很多类型之间的转换都会自动发生,比如在这些类型之间的转换: 字符串(String),基本类型(如int) 和类型的包装类 (如Integer)之间,可以把不同的基本类型添加到同一数组(collections)中。
运算符重载
运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
3.类
Groovy类和java类一样,完全可以用标准java bean的语法定义一个Groovy类。但作为另一种语言,可以使用更Groovy的方式定义类,这样的好处是,可以少写一半以上的javabean代码。
(1)不需public修饰符
如前面所言,Groovy的默认访问修饰符就是public,如果Groovy类成员需要public修饰,则根本不用写它。
(2)不需要类型说明
同样前面也说过,Groovy也不关心变量和方法参数的具体类型。
(3)不需要getter/setter方法
在很多ide(如eclipse)早就可以为程序员自动产生getter/setter方法了,在Groovy中,不需要getter/setter方法--所有类成员(如果是默认的public)根本不用通过getter/setter方法引用它们(当然,如果一定要通过getter/setter方法访问成员属性,Groovy也提供了它们)。
(4)不需要构造函数
不再需要程序员声明任何构造函数,因为实际上只需要两个构造函数(1个不带参数的默认构造函数,1个只带一个map参数的构造函数--由于是map类型,通过这个参数可以构造对象时任意初始化它的成员变量)。
(5)不需要;结尾
Groovy中每一行代码不需要分号作为结束符。
4.
在Groovy中类和文件的对应关系并不像Java中那么固定(Java中一个文件只能有一个声明为public的类和其他一些非公共的类和内嵌类) 。在同一个groovy文件中可以包含多个public的类定义。具体规则如下:
1、如果在一个groovy文件中没有任何类定义,它将被当做script来处理,也就意味着这个文件将被透明的转换为一个Script类型的类,这个自动转换得到的类将使用原始的groovy文件名(去掉扩展名,没有包名,在default包中)作为类的名字。groovy文件的内容被打包进run方法,另外在新产生的类中被加入一个main方法以进行外部执行该脚本。
2、如果在groovy文件正好有一个类的定义,并且该类的名字与文件名称相同,那么这就和java中的类与文件的一一对应关系相同。
3、在一个groovy文件中可以包含多个不同可见性的类定义,并且没有强制性的要求其中有一个类的类名与文件名相同。groovy编译器会很乐于把该文件中定义的所有的类都编译成*.class文件。如果希望能够直接调用这个groovy script,比如说在使用groovy命令行或者在某个IDE中执行,那么应该在该文件中的第一个类中定义一个main方法。
4、在一个groovy文件中可以混合类的定义和脚本定义。在这种情况下,那些脚本代码将会变成直接调用的主类,所以在这种情况下不应该再定义一个和文件同名的类。
5、在没有经过明确的编译过程即执行时,groovy将通过文件名来查找类。在这种情况下,名称将会很重要。Groovy只能找到那些和文件名匹配的类。在找到这种名字匹配的类时,找到的文件中定义的其他类将被解析并变得对groovy可见。
5.语法
基本类型
- byte -这是用来表示字节值。例如2。
- short -这是用来表示一个短整型。例如10。
- int -这是用来表示整数。例如1234。
- long -这是用来表示一个长整型。例如10000090。
- float -这是用来表示32位浮点数。例如12.34。
- double -这是用来表示64位浮点数,这些数字是有时可能需要的更长的十进制数表示。例如12.3456565。
- char -这定义了单个字符文字。例如“A”。
- Boolean -这表示一个布尔值,可以是true或false。
- String -这些是以字符串的形式表示的文本。例如,“Hello World”的。
- BigInteger类型后缀为G或g
- Long类型后缀为L或l
- Integer类型后缀为I或i
- Bigdecimal类型后缀为G或g
- Double类型后缀为D或d
- Float类型后缀为F或f
与Java一致,但是可以不声明类型,使用def关键字。
字符
Groovy没有明确的字符类型,可以通过以下三种方式创建:
- char c1 = 'A' // 类型声明为char
- assert c1 instanceof Character
- def c2 = 'B' as char // 通过as将类型强制指定为char
- assert c2 instanceof Character
- def c3 = (char)'C' // 通过类型转换
- assert c3 instanceof Character
字符串
Groovy中的字符串可以用单引号('),双引号(“)或三引号(”“”)括起来。此外,由三重引号括起来的Groovy字符串可以跨越多行
String a = 'Hello Single';
String b = "Hello Double";
String c = "'Hello Triple" + "Multiple lines'";
运算符
- 算术运算符:+、-、*、/、%、++、--
- 关系运算符:==、!= 、<、<=、>、>=
- 逻辑运算符:&&、||、!
- 位运算符:&、|、^、〜
- 赋值运算符:+=、-=、*=、/=、(%)=
- 范围运算符:..
范围
Groovy支持java的范围方式,同时有自己的范围运算度”..”
- 1..10 - 包含范围的示例
- 1 ..<10 - 独占范围的示例
- 'a'..'x' - 范围也可以由字符组成
- 10..1 - 范围也可以按降序排列
- 'x'..'a' - 范围也可以由字符组成并按降序排列。
列表(List)
列表是用于存储数据项集合的结构。在Groovy中,List保存了一系列对象引用。List中的对象引用占据序列中的位置,并通过整数索引来区分
要处理列表中的数据,我们必须能够访问各个元素。 Groovy列表使用索引操作符[]索引。列表索引从零开始,这指的是第一个元素。
- [11,12,13,14] - 整数值列表
- ['Angular','Groovy','Java'] - 字符串列表
- [1,2,[3,4],5] - 嵌套列表
- ['Groovy',21,2.11] - 异构的对象引用列表
- [] - 一个空列表
数组
Groovy定义数组的方式和定义list的方式一样,只不过声明时需要制定类型,或者通过as
来强制制定类型为Array。
Groovy不支持Java数组的初始化方式。
- String[] arrStr = ['Ananas', 'Banana', 'Kiwi']
- def numArr = [1, 2, 3] as int[]
- //多维数组
- def matrix3 = new Integer[3][3]
映射(Map)
映射(也称为关联数组,字典,表和散列)是对象引用的无序集合。Map集合中的元素由键值访问。 Map中使用的键可以是任何类。当我们插入到Map集合中时,需要两个值:键和值。
Map中通过[key]
或.key
的方式来获取key对应的value。如果key不存在,则返回null。
- ['TopicName':'Lists','TopicName':'Maps'] - 具有TopicName作为键的键值对的集合及其相应的值。
- [:] - 空映射。
闭包
闭包是一个短的匿名代码块。它通常跨越几行代码。一个方法甚至可以将代码块作为参数。它们是匿名的。
def clos = {println "Hello World"};
clos.call();
正则表达式
Groovy使用~”pattern” 来支持正则表达式,它将使用给定的模式字符串创建一个编译好的Java Pattern 对象。Groovy也支持 =~(创建一个Matcher)和 ==~ (返回boolean,是否给定的字符串匹配这个pattern)操作符。
对于groups的匹配, matcher[index] 是一个匹配到的group字符串的List或者string。
正则表达式的辅助符号
正则表达式的元字符
XML及HTML支持
Groovy 引入了一些全新的、更加合理的方法来创建和处理 XML及HTML。代码更加简洁,更具表达性。
- XML标记构建器 Groovy支持基于树的标记生成器BuilderSupport,它可以被子类化以生成各种树结构对象表示
- XML解析器 - Groovy XmlParser类使用一个简单的模型来将XML文档解析为Node实例的树。
JSON
- JsonSlurper JsonSlurper是一个将JSON文本或阅读器内容解析为Groovy数据的类结构,例如map,列表和原始类型,如整数,双精度,布尔和字符串。
- JsonOutput 此方法负责将Groovy对象序列化为JSON字符串
数据库
Groovy的groovy-sql模块提供了比当前Java的JDBC技术更高级的抽象。Groovy sql API支持各种各样的数据库,其中一些如下所示。
- HSQLDB
- Oracle
- SQL Server
- MySQL
- MongoDB