概述
Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。
Groovy是从Java衍生出来的,并且运行在Java虚拟机上的语言.其目标是不管作为脚本语言,还是编程语言,都可以简单、直接使用。Groovy 也并不会替代 Java,而是相辅相成、互补的关系,具体使用哪门语言这取决于要解决的问题和使用的场景。
Groovy语法
入门Demo
配置环境
官网下载地址:https://groovy.apache.org/download.html
下载
解压
配置环境变量
在 Path 环境变量中添加 Groovy 的bin 目录路径
验证
启动命令窗口,输入groovy -version指令,打印如下图,即为安装成功。
集成IDEA
创建项目
新建Project,选择Groovy,注意要选择Project SDK和Groovy library,默认是没有Groovy library的,选择右边的 create 按钮 ,之后选择自己安装groovy的目录即可,然后点击next
Hello World测试
class Groovy_T {
// Groovy注释标记和Java一样,支持 //或者/**/
static void main(String[] args) {
// 使用 println 就可打印输出,并且类和方法默认就是public,可以不用写 (分号也可省略)
println("hello groovy")
}
- 使用 println 就可打印输出,并且类和方法默认就是public,可以不用写
- Groovy注释标记和Java一样,支持//或者/**/
- Groovy语句可以不用分号结尾
基础语法
数据类型
Groovy 的内置数据类型和 Java 一样有8种。 byte、short、int、long、float、double、char、 boolean并且都有其对应的封装类
此外,以下类可用于支持高精度计算
名称 | 描述 | 例如 |
---|---|---|
java.math.BigInteger | 不可变的任意精度的有符号整数数字 | 30克 |
java.math.BigDecimal | 不可变的任意精度的有符号十进制数 | 3.5克 |
Groovy 变量
Groovy中的变量可以通过两种方式定义 - 使用数据类型的本地语法,或者使用def关键字。对于变量定 义,必须明确提供类型名称或在替换中使用"def"。这是Groovy解析器需要的。
Groovy 提供了 def关键字供使用,它可以省略变量类型的定义,根据变量的值进行类型推导。
变量声明
变量声明告诉编译器为变量创建存储的位置和大小。
下面是一个变量声明的例子
class Example {
static void main(String[] args) {
// x is defined as a variable
String x = "Hello";
def var = "测试变量"
// The value of the variable is printed to the console println(x);
println(var)
}
}
Groovy 字符串
Groovy提供了多种表示String字面量的方法。 Groovy中的字符串可以用单引号('),双引号(“)或三 引号(”“”)括起来。
- 单引号’'–>所见即所得,‘不支持’变量内插,有’特殊字符’同样的通过’反斜杠转义’
- 双引号"“–>可以通过${var}进行"变量内插(GString)” -->'常用
- 三引号"“”–>可以改变输出格式
GStrings是groovy.lang.GString的实例,并且允许文本中包含占位符,GStrings并不是String的子类, 因为String类是最终类(final class)不能被继承。然而,GString与一般的字符串一样,因为Groovy能 将GStrings转型为Java strings。
GString 适用于编写模板代码,因为必须动态构建字符串,上面的字符串拼接可以优化为:
@Test
void test99(){
String price = '999'
String abc2 = "价格是: ${price}"; println(abc2)
}
Groovy 运算符
运算符是一个符号,通知编译器执行特定的数学或逻辑操作。
大部分运算符和 Java 一样,如:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符 与 Java 不同点在于,新增了 范围运算符
Groovy支持范围的概念,并在…符号的帮助下提供范围运算符的符号。下面给出了范围运算符的一个简 单示例。
def range = 0..5
这只是定义了一个简单的整数范围,存储到一个局部变量称为范围内的下限为0和上限为5。 以下代码段显示了如何使用各种运算符。
class Example {
static void main(String[] args) { def range = 5..10;
println(range);
println(range.get(2));
}
}
当我们运行上面的程序,我们会得到以下结果 -
从println语句中,可以看到显示在range语句中定义的整个数字范围。
get语句用于从定义的范围中获取一个对象,它将索引值作为参数。
[5, 6, 7, 8, 9, 10]
7
Groovy 循环
while循环
while语句首先通过计算条件表达式(布尔值)来执行,如果结果为真,则执行while循环中的语句。
class Example {
static void main(String[] args) { int count = 0;
while(count<5) {
println(count);
count++;
}
}
}
通过首先计算条件表达式(布尔值)来执行 while 语句,如果结果为true,则执行while循环中的语 句。从while语句中的条件的评估开始重复该过程 此循环继续,直到条件计算为false。当条件变为假 时,循环终止。 然后程序逻辑继续紧跟在while语句之后的语句
for循环
for语句用于遍历一组值。
class Example {
static void main(String[] args) {
for(int i = 0;i<5;i++) { println(i);
}
}
}
for-in循环
class Example {
static void main(String[] args) { int[] array = [0,1,2,3];
for(int i in array) {
println(i);
}
}
}
在上面的例子中,我们首先初始化一个具有0,1,2和3的4个值的整数数组。然后我们使用for循环语句首 先定义一个变量i,然后遍历数组中的所有整数 并相应地打印值。
for-in 语句也可用于循环范围。以下示例说明如何完成此操作:
class Example {
static void main(String[] args) { for(int i in 1..5) {
println(i);
}
}
}
for-in 语句也可用于循环访问Map
class Example {
static void main(String[] args) {
def employee = ["Ken" : 21, "John" : 25, "Sally" : 22]; for(emp in employee) {
println(emp);
}
}
}
Groovy 方法
Groovy 中的方法是使用返回类型或使用 def 关键字定义的。方法可以接收任意数量的参数。定义参数 时,不必显式定义类型。可以添加修饰符,如 public,private 和 protected。默认情况下,如果未提供 可见性修饰符,则该方法为 public。
最简单的方法是没有参数的方法,如下所示:
def methodName() { //Method code
}
下面是一个简单方法的例子
class Example {
static def DisplayName() {
println("This is how methods work in groovy"); println("This is an example of a simple method");
}
static void main(String[] args) {
DisplayName();
}
}
在上面的例子中,DisplayName 是一个简单的方法,它由两个 println 语句组成,用于向控制台输出一 些文本。在我们的静态 main 方法中,我们只是调用 DisplayName 方法。上述方法的输出将是
This is how methods work in groovy This is an example of a simple method
方法参数
如果一个方法的行为由一个或多个参数的值确定,则它通常是有用的。我们可以使用方法参数将值传递 给被调用的方法。请注意,参数名称必须彼此不同。
使用参数的最简单的方法类型,如下所示
def methodName(parameter1, parameter2, parameter3) {
// Method code goes here
}
以下是使用参数的简单方法的示例
class Example {
static void sum(int a,int b) { int c = a+b;
println(c);
}
static void main(String[] args) { sum(10,5);
}
}
在这个例子中,我们创建一个带有 2 个参数 a 和 b 的 sum 方法。两个参数都是 int 类型。然后我们从我 们的 main 方法中调用 sum 方法,并将值传递给变量 a 和 b。
然后我们从我们的 main 方法中调用 sum 方法,并将值传递给变量 a 和 b。
上述方法的输出将是值 15。
默认参数
Groovy 中还有一个规定来指定方法中的参数的默认值。 如果没有值传递给参数的方法,则使用缺省 值。 如果使用非默认和默认参数,则必须注意,默认参数应在参数列表的末尾定义。
以下是使用参数的简单方法的示例
def someMethod(parameter1, parameter2 = 0, parameter3 = 0) {
// Method code goes here
}
让我们看看我们之前看到的添加两个数字的相同示例,并创建一个具有一个默认和另一个非默认参数的 方法
class Example {
static void sum(int a,int b = 5) { int c = a+b;
println(c);
}
static void main(String[] args) { sum(6);
}
}
在这个例子中,我们创建一个具有两个参数 a 和 b 的 sum 方法。两个参数都是 int 类型。此示例和上一 个示例的区别在于,在这种情况下,我们将 b 的默认值指定为5。
因此,当我们从 main 方法中调用 sum 方法时,我们可以选择只传递一个值为6的值,并将其分配给 sum 方法中的参数 a。
上述方法的输出将为值 11。
class Example {
static void sum(int a,int b = 5) { int c = a+b;
println(c);
}
static void main(String[] args) { sum(6,6);
}
}
我们也可以通过传递 2 个值来调用 sum 方法,在上面的例子中,我们传递 2 个值 6 第二个值 6 实际上 将替换分配给参数 b 的默认值。
上述方法的输出将是值 12。
方法返回值
方法也可以将值返回到调用程序。 这在现在编程语言中是必需的,其中方法执行某种计算,然后将所需 值返回到调用方法。
下面是一个带有返回值的简单方法的例子。
class Example {
static int sum(int a,int b = 5) { int c = a+b;
return c;
}
static void main(String[] args) { println(sum(6));
}
}
在我们上面的例子中,注意这次我们为我们的方法 sum 指定一个类型为 int 的返回类型。 在方法中,我 们使用 return 语句将 sum 值发送到调用主程序。 由于方法的值现在可用于 main 方法,因此我们使用 println 函数在控制台中显示该值。
在前面的例子中,我们将我们的方法定义为静态方法,这意味着我们可以直接从类中访问这些方法。方 法的下一个示例是实例方法,其中通过创建类的对象来访问方法。我们将在后面的章节中看到类,现在 我们将演示如何使用方法。
上述方法的输出将为值 11。
实例方法
方法通常在 Groovy 中的类中实现,就像 Java 语言一样。类只是一个蓝图或模板,用于创建定义其属性 和行为的不同对象。类对象显示由其类定义的属性和行为。因此,通过在类中创建方法来定义行为。
以下是如何实现方法的示例。
class Example {
int x;
public int getX() {
return x;
}
public void setX(int pX) {
x = pX;
}
static void main(String[] args) { Example ex = new Example(); ex.setX(100);
println(ex.getX());
}
}
在我们上面的例子中,这次我们没有为类方法指定静态属性。在我们的 main 函数中,我们实际上创建 了一个 Example 类的实例,然后调用 ‘ex’ 对象的方法。
上述方法的输出将是值 100。
本地和外部参数名称
Groovy 提供的设施就像java一样具有本地和全局参数。在下面的示例中,lx 是一个局部参数,它只具有 getX() 函数内的作用域,x 是一个全局属性,可以在整个 Example 类中访问。如果我们尝试访问 getX() 函数之外的变量 lx,我们将得到一个错误。
class Example {
static int x = 100;
public static int getX() {
int lx = 200;
println(lx);
return x;
}
static void main(String[] args) { println getX()
}
}
当我们运行上面的程序,我们会得到以下结果。
200
100