规则引擎专题---5、Groovy环境搭建和基础语法

news2025/1/23 22:32:45

概述

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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1279476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线程安全的问题以及解决方案

线程安全 线程安全的定义 线程安全:某个代码无论是在单线程上运行还是在多线程上运行,都不会产生bug. 线程不安全:单线程上运行正常,多线程上运行会产生bug. 观察线程不安全 看看下面的代码: public class ThreadTest1 {public static int count 0;public static void main…

<JavaEE> synchronized关键字和锁机制 -- 锁的特点、锁的使用、锁竞争和死锁、死锁的解决方法

目录 一、synchronized 关键字简介 二、synchronized 的特点 -- 互斥 三、synchronized 的特点 -- 可重入 四、synchronized 的使用示例 4.1 修饰代码块 - 锁任意实例 4.2 修饰代码块 - 锁当前实例 4.3 修饰普通方法 - 锁方法所在实例 4.4 修饰代码块 - 锁指定类对象 …

threadlocal - 黑马程序员

目录 1、ThreadLocal介绍1.2 ThreadLocal基本使用1.2.1、常用方法1.2.2 使用案例 1.3 ThreadLocal类与synchronized关键字 2、运用场景_事务案例3、ThreadLocal的内部结构4、 ThreadLocal的核心方法源码5、ThreadLocalMap源码分析5.2 弱引用和内存泄漏 课程地址&#xff1a; ht…

【大学英语视听说上】“智力”口语问答练习

题目&#xff1a; book 2, page 9, question 4 回答&#xff1a; 1: What do you think of the view “Intelligence must be bred, not trained”? I think this view is biased. The view suggests that intelligence is primarily determined by genetic factors and inh…

drawio画图工具的四种使用方式

1、免安装使用&#xff08;绿色版&#xff09; 这种直接下载下来直接就可以使用&#xff0c;属于绿色版&#xff08;开箱即用&#xff09;&#xff0c;适用于个人 点击下载地址 2、 安装使用 这种下载下来就需要安装才可使用&#xff0c;适用于个人 点击下载地址 3、war包…

P3 Linux应用编程:系统调用与库函数

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f6f8;推荐专栏3: ​​​​​​《 链表_Chen…

轻量封装WebGPU渲染系统示例<42>- vsm阴影实现过程(源码)

前向实时渲染vsm阴影实现的主要步骤: 1. 编码深度数据&#xff0c;存到一个rtt中。 2. 纵向和横向执行遮挡信息blur filter sampling, 存到对应的rtt中。 3. 将上一步的结果(rtt)应用到可接收阴影的材质中。 具体代码情况文章最后附上的实现源码。 当前示例源码github地址: …

Azure Machine Learning - 使用 Python 进行语义排名

在 Azure AI 搜索中&#xff0c;语义排名是查询端功能&#xff0c;它使用 Microsoft AI 对搜索结果重新评分&#xff0c;将具有更多语义相关性的结果移动到列表顶部。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&am…

基于单片机的多功能视力保护器(论文+源码)

1.系统设计 多功能视力保护器在设计过程中能够对用户阅读过程中的各项数据信息进行控制&#xff0c;整体设计分为亮种模式&#xff0c;分别是自动模式&#xff0c;手动模式。在自动模式的控制下&#xff0c;当单片机检测当前光照不强且有人时就开启LED灯&#xff0c;并且会根据…

实现跨平台高手必修的课程,玩转Flutter动态化的解决的一些精华部分总结

Flutter作为一种快速、可靠的跨平台移动应用开发框架&#xff0c;在动态化方面也有很多令人兴奋的特性。本文将总结Flutter动态化的一些精华部分&#xff0c;帮助开发者更好地利用这些功能。 正文&#xff1a; 在实现跨平台高手必修的课程中&#xff0c;Flutter动态化是一个不…

kubernetes七层负载Ingress搭建(K8S1.23.5)

首先附上K8S版本及Ingress版本对照 Ingress介绍 NotePort&#xff1a;该方式的缺点是会占用很多集群机器的端口&#xff0c;当集群服务变多时&#xff0c;这个缺点就愈发的明显(srevice变多&#xff0c;需要的端口就需要多) LoadBalancer&#xff1a;该方式的缺点是每个servi…

人工智能学习5(特征抽取)

编译环境&#xff1a;PyCharm 文章目录 编译环境&#xff1a;PyCharm 特征抽取无监督特征抽取(之PCA)代码实现鸢尾花数据集无监督特征抽取 有监督特征抽取(之LDA)代码实现,生成自己的数据集并进行有监督特征抽取(LDA)生成自己的数据集PCA降维和LDA降维对比 代码实现LDA降维对鸢…

mysql服务日志打印,时区不对的问题

查资料发现 原来日志的时区和服务器的时区不是一个参数控制的 log_timestamps 单独控制日志的时区 show global variables like log_timestamps;看到默认的是UTC&#xff0c;只需要修改为和系统一致就行 #数据库中直接修改 set global log_timestampsSYSTEM;#配置文件my.cn…

NacosSync 用户手册

手册目标 理解 NacosSync 组件启动 NacosSync 服务通过一个简单的例子&#xff0c;演示如何将注册到 Zookeeper 的 Dubbo 客户端迁移到 Nacos。 介绍 NacosSync是一个支持多种注册中心的同步组件,基于Spring boot开发框架,数据层采用Spring Data JPA,遵循了标准的JPA访问规范…

面试题:MySQL为什么选择B+树作为索引结构

文章目录 前言二、平衡二叉树(AVL)&#xff1a;旋转耗时三、红黑树&#xff1a;树太高四、B树&#xff1a;为磁盘而生五、B树六、感受B树的威力七、总结 前言 在MySQL中&#xff0c;无论是Innodb还是MyIsam&#xff0c;都使用了B树作索引结构(这里不考虑hash等其他索引)。本文…

视频生成的发展史及其原理解析:从Gen2、Emu Video到PixelDance、SVD、Pika 1.0

前言 考虑到文生视频开始爆发&#xff0c;比如11月份就是文生视频最火爆的一个月 11月3日&#xff0c;Runway的Gen-2发布里程碑式更新&#xff0c;支持4K超逼真的清晰度作品(runway是Stable Diffusion最早版本的开发商&#xff0c;Stability AI则开发的SD后续版本)11月16日&a…

wordpress安装之Linux解压缩安装

本次教程是为了让大家少走弯路&#xff0c;可以更直观的去认识我们不懂的知识面。 首先我们安装解压缩的软件 命令如下&#xff1a; yum install -y unzip 上一篇我们讲到传输文件了 这篇我们把传输过来的压缩包解压并进行安装。follow me&#xff01; 我们输入命令 unzi…

Spring Cloud NetFlix

文章目录 Spring Cloud1 介绍2 Eureka&#xff08;服务注册与发现&#xff09;2.1 介绍2.2 服务注册与发现示例2.2.1 Eureka Server&#xff1a;springcloud-eureka2.2.2 Eureka Client&#xff1a;springcloud-provider2.2.3 Eureka Client&#xff1a;springcloud-consumer 2…

前端可滚动分类商品List列表 可用于电商分类列表

前端可滚动分类商品List列表 可用于电商分类列表 引言 在电商应用中&#xff0c;一个高效、用户友好的分类列表是提高用户体验和转化率的关键。本文将探讨如何使用xg-list-item、uni-grid和xg-tab等组件创建一个可滚动的分类商品列表&#xff0c;并处理相关的用户交互事件&…

Python容器——字典

Key——Value 键值对