Groovy 脚本入门教程

什么是 Groovy 脚本?

Apache Groovy 是一种面向对象的、与 Java 语法兼容的编程语言,专为 Java 平台构建。这种动态语言具有许多与 Python、Ruby、Smalltalk 和 Pero 类似的特性。Groovy 源代码会被编译成 Java 字节码,因此可以在任何安装了 JRE 的平台上运行。Groovy 还在后台执行许多任务,使其更加敏捷和动态。

Groovy 语言可用作 Java 平台的脚本语言。它几乎就像一个 Java 的超级版本,提供了 Java 的企业级功能。它还提供了许多生产力特性,如 DSL 支持、闭包和动态类型。与其他一些语言不同,它被设计为 Java 的伴侣,而不是替代品。

为什么选择 Groovy?

以下是你应该使用和学习 Groovy 的主要原因:

  • Groovy 是一种敏捷且动态的语言
  • 与所有现有的 Java 对象和库无缝集成
  • 对 Java 开发者来说感觉简单自然
  • 与 Java 相比,代码更简洁、更有意义
  • 你可以根据需要,在 Java 应用程序中使用它

Groovy 历史

  • 2003 年:由 Bob McWhirter 和 James Strachan 开发
  • 2004 年:被纳入 JSR 241,但后来被放弃
  • 2005 年:由 Jeremy Rayner 和 Guillaume Laforge 重新推出
  • 2007 年:Groovy 1.0 版本
  • 2012 年:Groovy 2 版本
  • 2014 年:Groovy 2.3 版本(官方支持 JDK 8)
  • 2015 年:Groovy 成为 Apache 软件基金会的项目

Groovy 的特性

  • 列表、映射、范围、正则表达式字面量
  • 多方法和元编程
  • Groovy 类和脚本通常存储在 .groovy 文件中
  • 脚本包含 Groovy 语句,无需任何类声明。
  • 脚本还可以包含类定义之外的方法定义。
  • 它可以被编译并与传统的 Java 应用程序完全集成。
  • 语言级别支持映射、列表、正则表达式
  • 支持闭包、动态类型、元对象协议
  • 支持静态和动态类型及运算符重载
  • 列表(数组)、映射、范围和正则表达式的字面量声明

如何安装 Groovy

第一步:确保你已安装 Java

第二步:访问 https://groovy-lang.cn/download.html 并点击安装程序。

install Groovy

注意:你也可以通过 Zip 文件或 Eclipse IDE 安装 Groovy。在本 Groovy 教程中,我们将使用 Windows 安装程序。

第三步:运行下载的安装程序。选择语言,然后点击“确定”。

install Groovy

第四步:运行。在欢迎屏幕上,点击“下一步”。

install Groovy

第五步:同意许可条款。

install Groovy

第六步:选择要安装的组件,然后点击“下一步”。

install Groovy

第七步:选择安装目录,然后点击“下一步”。

install Groovy

第八步:选择开始菜单文件夹,然后点击“下一步”。

install Groovy

第九步:安装完成后,保持路径默认设置,然后点击“下一步”。

install Groovy

第十步:点击“下一步”。

install Groovy

第十一步:在开始菜单中搜索 Groovy Console。

install Groovy

Groovy Hello World 示例

假设我们想在 Java 中打印一个简单的字符串“Hello World”。实现 Groovy hello world 的代码如下:

public class Demo {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

上面的代码在 Java 和 Groovy 中都有效,因为 Groovy 是 Java 的超集。但 Groovy 的优势在于,我们可以省去类创建、公共方法创建等步骤,只需一行代码即可实现相同的输出,如下所示:

println "Hello World."

无需分号

无需括号

System.out.println 简化为 println

Groovy 变量

在 Java 中,静态绑定是强制性的。这意味着变量的类型必须提前声明。

public class Demo {
    public static void main(String[] args) {
        int x = 104;
        System.out.println(x);
        //x = "Guru99";
    }
}

在本 Groovy 教程的示例中,变量的类型(整数)已使用关键字“int”提前声明。如果你想声明一个浮点数,可以使用关键字 float。

如果你尝试将 String 值赋给 int(取消注释第 5 行),你将收到以下错误:

Demo.java:5: error: incompatible types: String cannot be converted to int
x = "Guru99";

相反,Groovy 支持动态类型。变量使用关键字“def”定义,变量的类型无需提前声明。编译器会在运行时确定变量类型,你甚至可以更改变量类型。

考虑以下 Groovy 示例:

def x = 104
println x.getClass()
x = "Guru99"
println x.getClass()

输出

class java.lang.Integer
class java.lang.String

在 Groovy 中,你可以创建多行字符串。只需确保将字符串用三个引号括起来。

def x = """Groovy
at
Guru99"""
println x

输出

Groovy
at
Guru99

注意:你仍然可以使用 byte、short、int、long 等变量类型,但在 Groovy 中,如果你已显式声明变量类型,则无法动态更改它。

考虑以下代码:

int x = 104
println x
x = "Guru99"

它会产生以下错误:

104
Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'Guru99' with class 'java.lang.String' to class 'int'
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'Guru99' with class 'java.lang.String' to class 'int'
    at jdoodle.run(jdoodle.groovy:3)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Command exited with non-zero status 1

Groovy - 运算符

运算符是告诉编译器执行某些数学或逻辑运算的符号。

Groovy 具有以下五种类型的运算符:

  • 算术运算符:加 (+),减 (-),乘 (*),除 (/)
  • 关系运算符:等于 (==),不等于 (!=),小于 (<),小于等于 (<=),大于 (>),大于等于 (>=)
  • 逻辑运算符:与 (&&),或 (||),非 (!)
  • 位运算符:与 (&),或 (|),Xor 或异或运算符 (^)
  • 赋值运算符:否定运算符 (~)

Groovy - 循环

在 Java 中,你会这样定义一个循环:

public class Demo {
    public static void main(String[] args) {
        for (int x = 0; x <= 5; x++) {
            System.out.println(x);
        }
    }
}

输出

0
1
2
3
4

你可以使用 upto 关键字在 Groovy 中实现相同的输出:

0.upto(4) {println "$it"}

你将获得与上面相同的输出。$it 是一个闭包,它提供当前循环的值。

考虑以下代码:

2.upto(4) {println "$it"}

它会产生以下输出:

2
3
4

你也可以使用 times 关键字获得相同的输出:

5.times{println "$it"}

假设你想通过 Java 的 for 循环 打印 0, 2, 4:

public class Demo {
    public static void main(String[] args) {
        for (int x = 0; x <= 5; x=x+2) {
            System.out.println(x);
        }
    }
}

输出

0
2
4

你可以使用 step 方法实现相同的功能:

0.step(7,2){println "$it"}

Groovy - 决策制定

语句 (Statements) 欺骗
if 语句 与 Java 一样,如果条件为真,则执行 if 语句。
if/else 语句 在 if/else 语句中,首先评估 if 语句中的条件。如果条件为真,则执行其后的语句。它会在 else 条件之前停止并退出循环。但是,如果条件为假,则执行 else 语句块中的语句。然后它退出循环。
嵌套 If 语句 当需要多个 if 语句时使用它。
switch 语句 当你有多个条件时,嵌套的 if-else 语句可能会变得难以阅读。为了使代码更具可读性,使用了 switch 语句。
嵌套 Switch 语句 在 Groovy 中,也可以使用嵌套的 switch 语句。

Groovy 列表

列表结构允许你存储数据项的集合。在 Groovy 编程语言中,列表保存对象引用的序列。它还显示了序列中的位置。列表字面量表示为由逗号分隔、用方括号括起来的对象系列。

Groovy 列表示例

字符串列表 - ['Angular', 'Nodejs,]

对象引用列表 - ['Groovy', 2, 4 2.6]

整数列表 - [16, 17, 18, 19]

空列表 - [ ]

Groovy 中可用的列表方法如下:

方法 描述
add() 允许你将新值追加到此列表的末尾。
contains() 如果此列表包含某个值,则返回 true。
get() 返回指定位置的元素。
isEmpty() 如果列表不包含任何元素,则返回 true。
minus() 此命令允许你创建一个新列表,其中包含原始列表的元素,但不包含在集合中指定的元素。
plus() 允许你创建一个新列表,其中包含原始列表的元素以及集合中提到的元素。
pop() 移除列表中的最后一个项。
remove() 移除指定位置的元素。
reverse() 创建一个新列表,该列表反转原始列表的元素。
size() 返回此列表中的元素数量。
sort() 返回排序后的副本。

考虑以下 Groovy 脚本示例:

def y = ["Guru99", "is", "Best", "for", "Groovy"]
println y
y.add("Learning")
println(y.contains("is"))
println(y.get(2))
println(y.pop())

输出

[Guru99, is, Best, for, Groovy]
true
Best
Learning

Groovy 映射

Groovy Map 是键值对的集合。

Groovy 映射示例:

  • [Tutorial: 'Java', Tutorial: 'Groovy'] – 键值对集合,其中 Tutorial 是键,后面是相应的值。
  • [ : ] 表示一个空映射。

Groovy 中可用的映射方法列表如下:

方法 描述
containsKey() 检查映射是否包含此键?
get() 此命令会在 Map 中查找键并返回相应的值。如果在 Map 中找不到任何条目,则返回 null。
keySet() 允许查找 Map 中的键集。
put() 将指定的 value 与 Map 中的给定 key 关联。如果 Map 之前包含此键的映射,则旧值将被指定的值替换。
size() 返回键值映射的数量。
values() 此命令返回值的集合视图。

Groovy 示例

def y = [fName:'Jen', lName:'Cruise', sex:'F']
print y.get("fName")

输出

Jen

Groovy - 闭包

Groovy 闭包是包装成对象的代码块。它充当方法或函数。

简单闭包示例:

def myClosure = {
       println "My First Closure"	
}
myClosure()

输出

My First Closure

闭包可以接受参数。标识符列表以逗号分隔,

箭头 (->) 标记参数列表的结束。

def myClosure = {
       a,b,c->
       y = a+b+c
       println y
}
myClosure(1,2,3)

输出

6

闭包可以返回值。

def myClosure = {
       a,b,c->
       return (a+b+c)
}
println(myClosure(1,2,3))

输出

6

有许多内置闭包,如“It”、“identity”等。闭包可以接受其他闭包作为参数。

Groovy 与 Java 对比

Groovy Java
在 Groovy 中,默认的访问修饰符是 public。这意味着没有指定访问修饰符的方法是 public 的,可以在类和包边界之外访问。 在 Java 中,默认的访问修饰符是包私有,即如果你不为字段、方法或类指定访问修饰符,它将成为包私有。
Getters 和 setters 会为类成员自动生成。 在 Java 中,你需要为字段定义 getters 和 setters 方法。
Groovy 允许使用双引号在字符串中进行变量替换。 Java 不支持变量替换。
类型信息是可选的。 Java 中类型信息是强制性的。
Groovy 不需要以分号结尾。 在 Java 中,每个语句都以分号结尾。
Groovy 会自动为每个程序创建一个名为 Script 的包装类。 在 Java 中,你需要 main 方法才能使类可执行。

关于 Groovy 的误解

误解 现实
我们可以仅将 Groovy 用于脚本。 它可以用于脚本。但是,除了脚本之外,你还可以执行许多其他任务。
Groovy 就是闭包。“它只是一个 函数式编程语言。” Groovy 继承了 Lisp 或 Closure 等函数式编程语言的特性。
如果你想做 TDD,Groovy 是理想的选择。 这个说法是正确的。但是,它绝不是使用 Groovy 的唯一原因。
只有当你想要使用 Grails 时才能使用 Groovy。 Grails 是一个强大的 Web 开发框架。

但 Groovy 提供的远不止这些。

使用 Groovy 的缺点

  • JVM 和 Groovy 脚本启动时间较慢,这限制了 OS 级别的脚本编写。
  • Groovy 在其他社区中并未被完全接受。
  • 不使用 IDE 使用 Groovy 不方便。
  • Groovy 可能会变慢,这会增加开发时间。
  • Groovy 可能需要大量内存。
  • 必须了解 Java。

Groovy 工具

我们将在本 Groovy 脚本教程中讨论 3 个重要工具:

1. groovysh:交互式执行代码。

2. groovyConsole:用于交互式代码执行的 GUI。

3. groovy:执行 Groovy 脚本。你可以像使用 PerlPython 等一样使用它。

Groovysh

  • 命令行 shell
  • 帮助你交互式地执行 Groovy 代码。
  • 允许输入语句或整个脚本。

Groovy Tools

Groovy Console

  • Swing 界面,充当一个最小的 Groovy 开发编辑器。
  • 允许你与 Groovy 代码进行交互。
  • 帮助你加载和运行 Groovy 脚本文件。

Groovy Tools

Groovy

它是执行 Groovy 程序和脚本的处理器。U

可用于测试简单的 Groovy 表达式。

Groovy Tools

摘要

  • Groovy 是一种用于 Java 平台的面向对象编程语言。
  • Groovy 脚本提供与所有现有 Java 对象和库的无缝集成。
  • Groovy 由 Bob McWhirter 和 James Strachan 于 2003 年开发。
  • 列表、映射、范围、正则表达式字面量是 Groovy 的重要特性。
  • Groovy 支持四种类型的运算符:1. 关系运算符 2. 逻辑运算符 3. 位运算符 4. 赋值运算符。
  • Groovy 使用 if、if/else、嵌套 if、switch、嵌套 switch 语句进行决策。
  • 列表结构允许你存储数据项的集合。
  • Groovy Map 是键值对的集合。
  • 在 Groovy 中,Getters 和 setters 会为类成员自动生成。
  • 在 Java 中,你可以为字段提供 getters 和 setters 方法。
  • 关于 Groovy 的最大误解是它只能用于脚本,这是不正确的。
  • 有时 Groovy 可能会变慢,这会增加开发时间。
  • 三个 Groovy 工具是:groovysh(执行代码),groovy Console(用于交互式代码执行的 GUI),以及 groovy(执行脚本)。