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没有明确的字符类型,可以通过以下三种方式创建:

  1. char c1 = 'A'  // 类型声明为char
  2. assert c1 instanceof Character
  3.  
  4. def c2 = 'B' as char  // 通过as将类型强制指定为char
  5. assert c2 instanceof Character
  6.  
  7. def c3 = (char)'C'  // 通过类型转换
  8. assert c3 instanceof Character

字符串

Groovy中的字符串可以用单引号('),双引号(“)或三引号(”“”)括起来。此外,由三重引号括起来的Groovy字符串可以跨越多行

String a = 'Hello Single';
String b = "Hello Double";
String c = "'Hello Triple" + "Multiple lines'";

运算符

  • 算术运算符:+、-、*、/、%、++、--
  • 关系运算符:==、!= 、<、<=、>、>=
  • 逻辑运算符:&&、||、!
  • 位运算符:&、|、^、〜

java执行groovy脚本获取输出日志 java groovy_groovy

  • 赋值运算符:+=、-=、*=、/=、(%)=
  • 范围运算符:..

范围

Groovy支持java的范围方式,同时有自己的范围运算度”..”

  • 1..10 - 包含范围的示例
  • 1 ..<10 - 独占范围的示例
  • 'a'..'x' - 范围也可以由字符组成
  • 10..1 - 范围也可以按降序排列
  • 'x'..'a' - 范围也可以由字符组成并按降序排列。

java执行groovy脚本获取输出日志 java groovy_groovy_02

列表(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数组的初始化方式。

  1. String[] arrStr = ['Ananas', 'Banana', 'Kiwi'] 
  2.  
  3. def numArr = [1, 2, 3] as int[]   
  4.  
  5. //多维数组
  6. 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。

java执行groovy脚本获取输出日志 java groovy_groovy_03

                                                               正则表达式的辅助符号

java执行groovy脚本获取输出日志 java groovy_groovy_04

                                                              正则表达式的元字符

XML及HTML支持

Groovy 引入了一些全新的、更加合理的方法来创建和处理 XML及HTML。代码更加简洁,更具表达性。

  1. XML标记构建器  Groovy支持基于树的标记生成器BuilderSupport,它可以被子类化以生成各种树结构对象表示
  2. XML解析器 - Groovy XmlParser类使用一个简单的模型来将XML文档解析为Node实例的树。

JSON

  1. JsonSlurper   JsonSlurper是一个将JSON文本或阅读器内容解析为Groovy数据的类结构,例如map,列表和原始类型,如整数,双精度,布尔和字符串。
  2. JsonOutput   此方法负责将Groovy对象序列化为JSON字符串

数据库

Groovy的groovy-sql模块提供了比当前Java的JDBC技术更高级的抽象。Groovy sql API支持各种各样的数据库,其中一些如下所示。

  • HSQLDB
  • Oracle
  • SQL Server
  • MySQL
  • MongoDB