目录
Groovy概述:
Groovy是Apache 旗下的一种基于JVM的面向对象的编程语言,既可以用于面向编程,又可以用作纯粹的脚本语言。在语言的设计上,Groovy吸纳了Python、Ruby和Smalltalk语言的优秀特性,比如动态类型转换、闭包和元编程支持。Groovy与Java可以互相调用并结合编程,比如在写Groovy的时候忘记了语法可以直接按Java的语法继续写,也可以在Java中调用Groovy脚本。与Java相比,Groovy语法更加灵活和简洁,可以用更少的代码来实现与Java实现的相同功能。
Groovy的编写和调试:
Groovy的代码可以在Android Studio和IntelliJ IDEA等IDE中进行编写和调试,这种方式的缺点是需要配置环境,这里推荐在文本中编写代码并结合命令行进行调试(文本准荐使用Sublime Text),关于命令行请查看后续。Groovy 编写和调试的具体操作步骤就是:在一个目录中新建build.gradle文件,在build.gradle文件中新建一个task,在task中编写Groovy代码,用命令行进入这个build.gradle文件所在的目录,运行gradle task名称等命令行对代码进行调试。
基本语法:
1.文字:
文字是在 groovy 中表示固定值的符号。 groovy 语言具有整数、浮点数、字符和字符串的表示法。
2.数据类型:
Groovy 提供了多种内置数据类型。 以下是 Groovy 中定义的数据类型列表 :
-
byte − 这用于表示一个字节值。 一个例子是 2。范围:-128 到 127。
-
short − 这用于表示一个短数字。 一个例子是 10。范围:-32,768 到 32,767。
-
int − 这用于表示整数。 一个例子是 1234。范围:-2,147,483,648 到 2,147,483,647。
-
long − 这用于表示长数字。 一个例子是 10000090。范围-9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807。
-
float − 这用于表示 32 位浮点数。 一个例子是 12.34。范围:1.40129846432481707e-45 到 3.40282346638528860e+38。
-
double − 这用于表示 64 位浮点数,这是有时可能需要的较长的十进制数表示。 例如 12.3456565。范围:4.94065645841246544e-324d 到 1.79769313486231570e+308d。
-
char − 这定义了单个字符文字。 一个例子是"a"。
-
Boolean − 这表示一个布尔值,可以为真或假。
-
String − 这些是用 the form 字符链表示的文本文字。 例如 "Hello World"。
-
类型除了基本类型之外,还允许使用以下对象类型(有时称为包装类型)。例如:java.lang.Byte,java.lang.Short,java.lang.Integer,java.lang.Long,java.lang.Float,java.lang.Double。
3.变量:
Groovy 中的变量可以通过两种方式定义 − 使用本机语法作为数据类型,或者是使用def 关键字。 对于变量定义,必须明确提供类型名称或使用"def"替换。 这是 Groovy 解析器所要求的。
4.运算符:
Groovy 有以下几种运算符 :
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 范围运算符。Groovy 支持范围的概念,并在 .. 符号的帮助下提供范围运算符的符号。
5.循环语句:
Groovy支持while循环,for循环,for in循环,支持遍历范围,列表,Map,数组和字符串等等多种类型。另外break语句和continue语句也支持。
6.条件语句:
Groovy支持if语句,if/else语句,switch语句。
7.方法:
Groovy 中的方法是使用返回类型或 def 关键字定义的。 方法可以接收任意数量的参数。 在定义参数时不需要显式定义类型。 可以添加诸如 public、private 和 protected 等修饰符。 默认情况下,如果没有提供可见性修饰符,则该方法是公共的。Groovy定义方法时,语句后面的语句可以省略,方法的括号可以省略,参数类型可以省略,return可以省略(省略return会把方法的最后一行作为返回值)。
def test(a,b){
//内容
}
test(1,2)
test 1,2
8.类:
Groovy类与Java类非常的相似,有以下区别:
- 默认类的修饰符为public。
- 没有可见性修饰符的字段会自动生成对应的setter方法和getter方法。
- 类不需要与它的源文件有相同的名字,但是建议采用相同的名字。
9.范围:
范围是指定值序列的简写。 Range 由序列中的第一个值和最后一个值表示,Range 可以是包含的,也可以是排除的。 包含范围包括从第一个到最后一个的所有值,而排他范围包括除最后一个之外的所有值。当然也可以升序和降序。
10.容器类:
Groovy没有定义自己的集合类,它在Java集合类的基础上进行了增强和简化,Groovy的List对应的是Java中的List接口,默认的实现类是Java中的ArrayLiat,当然也可以使用as操作符来显式的指定List的实现类为LinedList。要处理列表中的数据,我们必须能够访问各个元素。 Groovy 列表使用索引运算符 [] 进行索引。 列表索引从零开始,它指的是第一个元素。
def num=[1,2,3]
def l=[1,2,3] as LinkedList
Map(也称为关联数组、字典、表和散列)是对象引用的无序集合。 Map 集合中的元素通过键值访问。 Map 中使用的键可以是任何类。 当我们插入 Map 集合时,需要两个值:键和值。默认的实现类为LinkedHashMap。
def name=[one:'1',two:'2',three:'3']
def one='key'
def name=[(one):'1',two:'2',three:'3']
//如果想要以one的值作为键,则需要使用()的形式,否则还是该变量
11.日期:
Date 类表示特定的时间瞬间,精度为毫秒。 Date 类有两个构造函数。
12.异常:
任何编程语言都需要异常处理来处理运行时错误,以便维持应用程序的正常流程。异常通常会破坏应用程序的正常流程,这就是我们需要在应用程序中使用异常处理的原因。方法使用 try 和 catch 关键字的组合来捕获异常。 在可能产生异常的代码周围放置了一个 try/catch 块。所有可能引发异常的代码都放在受保护的代码块中。在 catch 块中,您可以编写自定义代码来处理您的异常,以便应用程序可以从异常中恢复。
12.1:断言:
Groovy断言和Java的断言不相同,Groovy的断言一直处于开启状态,是进行单元测试的首选方式。当断言的条件为false时,程序会抛出异常,不再执行下面的代码。断言使用assert关键字。
13.文件I/O:
在处理 I/O 时,Groovy 提供了许多帮助方法。 Groovy 提供了更简单的类来为文件提供以下功能。
- 读取文件
- 写入文件
- 遍历文件树
- 读取数据对象并将其写入文件
除此之外,您始终可以使用下面列出的普通 Java 类进行文件 I/O 操作。
- java.io.File
- java.io.InputStream
- java.io.OutputStream
- java.io.Reader
- java.io.Writer
def file = new File(路径)
file.eachLine{println it}
//eachLine 方法内置在 Groovy 的 File 类中,目的是确保读取文本文件的每一行
def file = new File(路径)
println file.text
//如果你想以字符串的形式获取文件的全部内容,可以使用文件类的 text 属性
new File('E:/','Example.txt').withWriter('utf-8') {
writer -> writer.writeLine 'Hello World'
}
//如果要写入文件,则需要使用 writer 类将文本输出到文件
14.泛型:
在定义类、接口和方法时,泛型使类型(类和接口)成为参数。 就像在方法声明中使用的更熟悉的形式参数一样,类型参数为您提供了一种通过不同输入重用相同代码的方法。 区别在于形式参数的输入是值,而类型参数的输入是类型。
public class 类<T> {
private T 字段;
public T 泛型方法() {
//
}
public void 方法(T 参数) {
//
}
15.闭包:
Groovy中的闭包是一个开放,匿名的代码块,可以接受参数,返回值并分配给变量,简而言之,是一个匿名的代码块,可以接受参数,有返回值。
15.1:定义:
闭包的定义语法为: { 参数列表 -> 语句 } 。多参数用逗号分割。注意:
- 参数列表的部分是可选的,如果闭包只有一个参数的话,则参数的名字也是可选的,因为Groovy会隐式的指定it作为参数名。当然也可以直接使用it代替参数名。
- 如果期望声明一个无参数的闭包,需要显式添加->来声明空参数列表, 以避免Groovy提供默认参数it。
//{参数列表->语句}
{println it}
//默认指定it作为参数名
{it-> println it}
//显式指定it
{ ->语句}
//无参
15.2:使用:
- 闭包是groovy.lang.Cloush类的一个实例。
- 可以将闭包赋值给变量或者字段,还可通过添加括号、call方法进行传参、调用。同时闭包在定义过程中还支持带有缺省值的参数。这样在进行闭包调用时,对于未给定的参数值, 闭包会使用缺省值。
- 对于闭包而言,闭包中如果未显式使用return语句, 返回最后一个表达式的结果;反之如果闭包中显式使用return语句, 返回指定值。
- 闭包可以当作方法进行调用,也可以显示调用call方法。
def a = {it->println it}//赋值给变量
def b={123}
assert b.call()==123//调用call方法
def c = { x, y -> x+y }
assert c(1,3) == 4//两个参数
def d = { x, y=5 -> x*y }
assert d.call( 1,7 ) == 7//缺省值
def result = d.call()//返回值
16.注解:
注解 是一种元数据形式,其中它们提供有关不属于程序本身的程序的数据。 注解对其注解的代码的操作没有直接影响。在 Groovy 中,一个基本注解如下所示 :@interface - at 符号字符 (@) 向编译器指示后面是注解。注解可以以the form的方法定义成员,没有主体和可选的默认值。Groovy 中注解的一个很好的特性是您也可以将闭包用作注解值。 因此,注解可以与多种表达方式一起使用。
17.命令行:
称为 groovysh 的 Groovy shell 可轻松用于评估 groovy 表达式、定义类和运行简单程序。 安装 Groovy 时会安装命令行 shell。
命令行参数 | 全名 | 详情 |
---|---|---|
-C | --color[=FLAG] | 启用或禁用 ANSI 颜色 |
-D | --define=NAME=VALUE | 定义系统属性 |
-T | --terminal=TYPE | 指定要使用的终端类型 |
-V | --version | 显示版本 |
-classpath | 指定在哪里找到类文件 – 必须是第一个参数 | |
-cp | --classpath | '-classpath' 的别名 |
-d | --debug | --debug 开启调试输出 |
-e | --evaluate=arg | 启动交互式会话时首先评估选项 |
-h | --help | 显示此帮助信息 |
-q | --quiet | 抑制多余的输出 |
-v | --verbose | 启用详细输出 |
同时可以在命令提示符下定义一个类、创建一个新对象并调用该类的方法。
17.1:补充:
shell 有许多不同的命令,它们提供对 shell 环境的丰富访问。 以下是它们的列表以及它们的作用。
序号 | 命令与说明 |
---|---|
1 | :help (:h ) 显示此帮助信息 |
2 | ? (:? ) 别名: :help |
3 | :exit (:x ) 退出 shell |
4 | :quit (:q ) 别名: :exit |
5 | import (:i ) 将一个类导入命名空间 |
6 | :display (:d ) 显示当前缓冲区 |
7 | :clear (:c ) 清除缓冲区并重置提示计数器 |
8 | :show (:S ) 显示变量、类或导入 |
9 | :inspect (:n ) 使用 GUI 对象浏览器检查变量或最后结果 |
10 | :purge (:p ) 清除变量、类、导入或首选项 |
11 | :edit (:e ) 编辑当前缓冲区 |
12 | :load (:l ) 将文件或 URL 加载到缓冲区中 |
13 | . (:. ) 别名: :load |
14 | .save (:s ) 将当前缓冲区保存到文件 |
15 | .record (:r ) 将当前会话记录到文件 |
16 | :alias (:a ) 创建别名 |
17 | :set (:= ) 设置(或列出)首选项 |
18 | :register (:rc) 向 shell 注册一个新命令 |
19 | :doc (:D ) 打开显示参数文档的浏览器窗口 |
20 | :history (:H ) 显示、管理和调用编辑行历史 |
18.其他:
18.1:asType:
asType可以用于数据的类型转换。
18.2:安全取值:
在Java中,要安全的获取某一个对象的值可能需要大量的if语句来进行非空判断,而在Groovy中可以使用?.来进行安全取值。
18.3:with操作符:
对同一个对象的属性进行赋值时,可以使用with操作符。