woodwhales's blog

技术改变生活

groovy 学习笔记

Groovy 是一种基于Java 平台的面向对象语言。 Groovy 1.0 于 2007 年 1 月 2 日发布,其中 Groovy 2.4 是当前的主要版本。 Groovy 通过 Apache License v 2.0 发布。

Groovy 官网:https://groovy-lang.org/

阿里云镜像下载:https://mirrors.aliyun.com/apache/groovy/

Groovy 基本语法

官方文档:http://www.groovy-lang.org/syntax.html

  1. 在一个 groovy 文件中可以定义类和脚本。

  2. 变量、方法建议使用 def 定义,而不使用具体的数据类型定义。

  3. groovy 的注释方式和 Java 一样,有单行和多行俩种。

  4. 语句末尾的分号可以省略,groovy 是以换行作为一行代码的结束。

  5. 默认类、方法、字段都是 public 修饰。

  6. 对象属性的操作:

    • 读取:
      • 对象.属性名
      • 对象的 getter 方法
      • 对象[“属性名”]
    • 赋值:
      • 对象.属性名 = xxx
      • 对象的 setter 方法
      • 构造器

    对类属性的操作本质是:通过属性对应的 getter 、setter 方法完成。

  7. 方法操作:

    • 声明时:参数类型、返回值类型可以省略
    • 调用时:() 可以省略
  8. 支持顺序结构、分支结构、循环结构、各种运算符(算术、关系、位、赋值、范围运算符)

  9. 基本类型也是对象,可以直接调用对象的方法

  10. groovy 中的字符串有单引号、双引号、三引号:

    • 单引号:作为字符串常量,没有运算能力
    • 双引号:可以引用变量,使用${}占位,有运算能力
    • 三引号:模板字符串,支持换行
  11. 数据类型:变量、属性、方法、闭包的参数及方法的返回值类型都是可有可无,都是在变量赋值的时候才决定其类型。

IDEA 创建 Groovy 项目

使用 idea 创建 Groovy 项目,主要需要指定本地安装的 groovy sdk:

创建 hello world 程序

groovy 类

在 src 目录下创建 Demo1.groovy 文件:

1
2
3
4
5
6
7
class Demo1 {

static void main(String[] args) {
print('woodwhales.cn')
}

}

通过编译后的 class 文件可以看出,当前 Demo1 类实现了 GroovyObject 接口:

groovy 脚本

在 src 目录下创建 Demo2.groovy 文件:

1
2
3
def website = 'woodwhlaes.cn'

print(website)

通过编译后的 class 文件可以看出,当前 Demo1 类继承了 Script:

groovy 闭包

闭包是一个短的匿名代码块。它通常跨越几行代码。一个方法甚至可以将代码块作为参数。它们是匿名的。

来一个简单的例子:

1
2
3
4
5
6
7
8
class Demo3 {

static void main(String[] args) {
def closure = { println "woodwhales.cn" };
closure.call();
}

}

在上面的例子中,代码{ println "woodwhales.cn" }被称为闭包。此标识符引用的代码块可以使用 call 语句执行。

当我们运行上面的程序,我们将得到以下结果:

1
woodwhales.cn

闭包中的形式参数

闭包也可以包含形式参数,以使它们更有用,就像Groovy中的方法一样。

1
2
3
4
5
6
7
8
class Demo3 {

static void main(String[] args) {
def closure = { website -> println "welcome ${website}" };
closure.call("woodwhales.cn");
}

}

在上面的代码示例中,注意使用${website},这导致 closure 接受一个参数。当通过 closure.call 语句调用闭包时,我们现在可以选择将一个参数传递给闭包。

当我们运行上面的程序,我们将得到以下结果:

1
welcome woodwhales.cn

闭包和变量

更正式地,闭包可以在定义闭包时引用变量。以下是如何实现这一点的示例。

1
2
3
4
5
6
7
8
9
class Demo3 {

static void main(String[] args) {
def str1 = "欢迎访问"
def closure = { website -> println "${str1} ${website}" };
closure.call("woodwhales.cn");
}

}

在上面的例子中,除了向闭包传递参数之外,我们还定义了一个名为 str1 的变量。闭包也接受变量和参数。

当我们运行上面的程序,我们将得到以下结果:

1
欢迎访问 woodwhales.cn

由于参数定义和获取是明确的,{}花括号也可以省略:

1
2
3
4
5
6
7
8
9
class Demo3 {

static void main(String[] args) {
def str1 = "欢迎访问"
def closure = { website -> println "$str1 $website" };
closure.call("woodwhales.cn");
}

}

在方法中使用闭包

闭包也可以用作方法的参数。在 Groovy 中,很多用于数据类型(例如列表和集合)的内置方法都有闭包作为参数类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Demo4 {

def static showMe(closure) {
closure.call("\n版权所有woodwhales.cn");
}

static void main(String[] args) {
def note = "groovy 学习笔记";
def closure = { copyright -> println "${note} ${copyright}" }
Demo4.showMe(closure);
}

}

输出结果:

1
2
groovy 学习笔记 
版权所有woodwhales.cn