Groovy基础学习2

1.正则表达式

正则表达式是用于在文本中查找子字符串的模式。Groovy使用~“regex”表达式本地支持正则表达式。引号中包含的文本表示用于比较的表达式。

可以创建一个正则表达式对象:

 def regex = ~"Groovy"

当定义正则表达式时,可以使用以下特殊字符

  • 有两个特殊的位置字符用于表示一行的开始和结束:caret(∧)和美元符号($)。

  • 正则表达式也可以包括量词。加号(+)表示一次或多次,应用于表达式的前一个元素。星号(*)用于表示零个或多个出现。问号(?)表示零或一次。

  • 元字符{和}用于匹配前一个字符的特定数量的实例。

  • 在正则表达式中,句点符号(。)可以表示任何字符。这被描述为通配符。

  • 正则表达式可以包括字符类。一组字符可以作为简单的字符序列,包含在元字符[和]中,如[aeiou]中。对于字母或数字范围,可以使用[a-z][a-mA-M]中的短划线分隔符。字符类的补码由方括号内的前导插入符号表示,如[∧a-z]中所示,并表示除指定的字符以外的所有字符。

2.异常处理

与Java类似

3.面向对象

与Java类似

4.泛型

与Java类似

5.特征

特征是语言的结构构造,允许

  • 行为的组成

  • 接口的运行时实现

  • 与静态类型检查/编译的兼容性

它们可以被看作是承载默认实现和状态的接口。使用trait关键字定义trait

例子:

 trait Marks {void DisplayMarks() {println("Display Marks")}}

然后可以使用implement关键字以类似与接口的方式实现trait

 class Example {static void main(String[] args) {Student st = new Student();st.StudentID = 1;st.Marks1 = 10; println(st.DisplayMarks());} } ​trait Marks { void DisplayMarks() {println("Display Marks");} } ​class Student implements Marks { int StudentIDint Marks1;}

实现接口

Traits 可以实现接口,在这种情况下,使用interface 关键字声明接口

下面给出了实现接口的特征的示例,在以下示例中,可以注意以下要点:

  • 接口Total 使用方法DisplayTotal 定义。

  • 特征Marks 实现了Total接口,因此需要为DisplayTotal方法提供一个实现

class Example {static void main(String[] args) {Student st = new Student();st.StudentID = 1;st.Marks1 = 10;println(st.DisplayMarks()); //Display Marksprintln(st.DisplayTotal()); //Display Total} } ​interface Total {void DisplayTotal() } ​trait Marks implements Total {void DisplayMarks() {println("Display Marks");}void DisplayTotal() {println("Display Total"); } } ​class Student implements Marks { int StudentIDint Marks1;  } 

属性

特征可以定义属性。下面给出了具有属性的trait的示例。

在以下示例中,integer 类型的 Marks1 是一个属性。

 
class Example {static void main(String[] args) {Student st = new Student();st.StudentID = 1;println(st.DisplayMarks());  //10println(st.DisplayTotal());  // Display Total} interface Total {void DisplayTotal() } trait Marks implements Total {int Marks1;void DisplayMarks() {this.Marks1 = 10;println(this.Marks1);}void DisplayTotal() {println("Display Total");} } class Student implements Marks {int StudentID }} 

行为的构成

特征可以用于以受控的方式实现多重继承,避免钻石问题。在下面的代码示例中,我们定义了两个特征 - Marks 和 Total。我们的 Student 类实现了两个特征。由于学生类扩展了这两个特征,它能够访问这两种方法 - DisplayMarks 和 DisplayTotal。

 
class Example {static void main(String[] args) {Student st = new Student();st.StudentID = 1;println(st.DisplayMarks());  //Marks1println(st.DisplayTotal());  //Total} } ​trait Marks {void DisplayMarks() {println("Marks1");} } ​trait Total {void DisplayTotal() { println("Total");} }  ​class Student implements Marks,Total {int StudentID }   

扩展特征

特征可能扩展另一个特征,在这种情况下,必须使用extends关键字。在下面的代码示例中,我们使用 Marks trait 扩展了 Total trait。

 class Example {static void main(String[] args) {Student st = new Student();st.StudentID = 1;println(st.DisplayMarks());  //Total} } ​trait Marks {void DisplayMarks() {println("Marks1");} } ​trait Total extends Marks {void DisplayMarks() {println("Total");} }  ​class Student implements Total {int StudentID }

6.Groovy闭包

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

下面是一个简单闭包的例子,

 class Example {static void main(String[] args) {def clos = {println "Hello World"};clos.call();} }

在上面的例子中,代码行 - {println“Hello World”}被称为闭包。此标识符引用的代码块可以使用call语句执行。

运行结果 :

Hello World

闭包中的形式参数

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

 class Example {static void main(String[] args) {def clos = {param->println "Hello ${param}"};clos.call("World");} }

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

运行结果 :

 Hello World

下一个图重复了前面的例子并产生相同的结果,但显示可以使用被称为它的隐式单个参数。这里的'it'是Groovy中的关键字

 class Example {static void main(String[] args) {def clos = {println "Hello ${it}"};clos.call("World");} }

运行结果 :

 Hello World

闭包和变量

闭包可以在定义闭包时引用变量。例

 class Example {     static void main(String[] args) {def str1 = "Hello";def clos = {param -> println "${str1} ${param}"}clos.call("World");str1 = "Welcome";clos.call("World");} }

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

运行结果

 Hello World Welcome World

在方法中使用闭包

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

以下示例显示如何将闭包作为参数发送到方法。

 class Example { def static Display(clo) {      clo.call("Inner");} static void main(String[] args) {def str1 = "Hello";def clos = { param -> println "${str1} ${param}" }clos.call("World");str1 = "Welcome";clos.call("World");Example.Display(clos);} }

在上述示例中:

  • 我们定义一个名为Display的静态方法,它将闭包作为参数

  • 然后我们在我们的main方法中定义一个闭包,并将它作为一个参数传递给我们的Display方法。

运行结果

 Hello WorldWelcome WorldWelcome Inner

集合和字符串的闭包

几个list,Map和String方法接受一个闭包作为参数。让我们看看在这些数据类型中如何使用闭包的例子。

使用闭包和列表

以下示例显示如何使用闭包与列表。在下例中,我们首先定义一个简单的值列表。列表集合类型然后定义一个名为.each的函数。此函数将闭包作为参数,并将闭包应用于列表的每个元素

 class Example {static void main(String[] args) {def lst = [11, 12, 13, 14];lst.each {println it}} }

运行结果:

 11121314

使用映射闭包

以下示例显示了如何使用闭包。在下例中,我们首先定义一个简单的关键值项Map。然后,映射集合类型定义一个名为.each的函数。此函数将闭包作为参数,并将闭包应用于映射的每个键值对。

 class Example {static void main(String[] args) {def mp = ["TopicName" : "Maps", "TopicDescription" : "Methods in Maps"]             mp.each {println it}mp.each {println "${it.key} maps to: ${it.value}"}} }

运行结果:

 TopicName = Maps TopicDescription = Methods in Maps TopicName maps to: Maps TopicDescription maps to: Methods in Maps

通常,我们可能希望遍历集合的成员,并且仅当元素满足一些标准时应用一些逻辑。这很容易用闭包中的条件语句来处理。

 class Example {static void main(String[] args) {def lst = [1,2,3,4];lst.each {println it}println("The list will only display those numbers which are divisible by 2")lst.each{num -> if(num % 2 == 0) println num}} }

上面的例子显示了在闭包中使用的条件if(num%2 == 0)表达式,用于检查列表中的每个项目是否可被2整除。

运行结果

 1 2 3 4 The list will only display those numbers which are divisible by 2.2 4 

闭包本身也提供了一些方法:

  • find() find方法查找集合中与某个条件匹配的第一个值

  • findAll() 它找到接收对象中与闭合条件匹配的所有值

  • any() & every() 方法any迭代集合的每个元素,检查布尔谓词是否对至少一个元素有效

  • collect() 该方法通过集合收集迭代,使用闭包作为变换器将每个元素转换为新值

7.Groovy 注释

注释是元数据的形式,其中它们提供关于不是程序本身的一部分的程序的数据。注释对它们注释的代码的操作没有直接影响。

注释使用:

  • 编译器信息 - 编译器可以使用注释来检测错误或者抑制警告

  • 编译时和部署时处理 - 软件工具可以处理注释信息以生成代码,XML文件等

  • 运行时处理 - 一些注释可以在运行时检查

在Groovy中,基本注释如下所示:

@interface - @符号向编译器提示以下是注释

单行注释

 //

多行注释

 /*  */

字符串类型

 @interface Simple { String str1() default "HelloWorld"; }

枚举类型

 enum DayOfWeek { mon, tue, wed, thu, fri, sat, sun } @interface Scheduled {DayOfWeek dayOfWeek() } 

类 类型

 @interface Simple {} @Simple class User {String usernameint age}def user = new User(username: "Joe",age:1); println(user.age); println(user.username);

注释成员值

使用注释时,需要至少设置所有没有默认值的成员。当定义后使用注释示例时,需要为其分配一个值。

 @interface Example {int status() }​@Example(status = 1)

关闭注释参数

Groovy中注释的一个很好的特性是,你也可以使用闭包作为注释值。因此注释可以与各种各样的表达式一起使用。

例:注释Onlyif是基于类值创建的。然后注释应用于两个方法,它们基于数字变量的值向结果变量发布不同的消息。

@interface OnlyIf {Class value() }  ​@OnlyIf({ number<=6 }) void Version6() {result << 'Number greater than 6' } ​@OnlyIf({ number>=6 }) void Version7() {result << 'Number greater than 6' }

元注释

这是groovy中注释的一个非常有用的功能。有时可能有一个方法的多个注释,如下,有时这可能变得麻烦有多个注释。

 @Procedure @Master class MyMasterProcedure {} 

在这种情况下,您可以定义一个元注释,它将多个注释集中在一起,并将元注释应用于该方法,所以对于以上的例子,可以使用AnnotationCollector来定义注释的集合。

 import groovy.transform.AnnotationCollector@Procedure @Master @AnnotationCollector

完成后,可以应用以下元注释器到该方法

 import groovy.transform.AnnotationCollector@Procedure @Master @AnnotationCollector@MasterProcedure class MyMasterProcedure {}

参考:Groovy 概述_w3cschool 

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

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

相关文章

单元测试框架jUnit

JUnit&#xff08;Java单元测试框架&#xff09;是用于在Java应用程序中执行单元测试的框架。它是一个开源框架&#xff0c;广泛用于Java开发中。以下是一些关于JUnit的常见问题以及相应的汉语回答&#xff1a; 1. **什么是JUnit&#xff1f;** - JUnit是一个用于编写和运行…

大型语言模型:RoBERTa — 一种稳健优化的 BERT 方法

slavahead 一、介绍 BERT模型的出现BERT模型带来了NLP的重大进展。 BERT 的架构源自 Transformer&#xff0c;它在各种下游任务上取得了最先进的结果&#xff1a;语言建模、下一句预测、问答、NER标记等。 尽管 BERT 性能出色&#xff0c;研究人员仍在继续尝试其配置&#xff0…

Postman接口自动化测试之——批量执行(集合操作)

集合定义&#xff1a;在接口自动化测试过程中将一组请求&#xff08;多条请求&#xff09;保存到一起进行集中管理。方便执行过程中的维护、导出和执行等。 创建集合 在引导页点击“Collection”&#xff0c;或者在“Collection”标签点击图标&#xff1b; 字段解释 集合描述…

Oracle的学习心得和知识总结(三十一)| ODBC开放式数据库连接概述及应用程序开发

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

无人机在融合通信系统中的应用

无人驾驶飞机简称“无人机”&#xff0c;是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞行器&#xff0c;现今无人机在航拍、农业、快递运输、测绘、新闻报道多个领域中都有深度的应用。 在通信行业中&#xff0c;无人机广泛应用于交通&#xff0c;救援&#xff0c;消…

CentOS:Docker 创建及镜像删除

1、安装docker 远程连接服务器&#xff0c;可以直接下载netsarang比较好用 家庭/学校免费 - NetSarang Website 如果有残留docker未删除干净&#xff0c;请使用 sudo yum -y remove docker docker-common docker-selinux docker-engine Step1&#xff1a;安装必要的一些…

【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别

目录 一、栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 一、栈(Stack) 1.1 概念 栈&#xff1a;一种特殊的线性表&…

第十七章 爬虫scrapy登录与中间件2

文章目录 数据盘区太快会报错&#xff0c;setting中配置延迟 连接提取器

解决:Android 报错 Failed to transform exifinterface-1.2.0.jar

一、问题说明 Failed to transform exifinterface-1.2.0.jar (androidx.exifinterface:exifinterface:1.2.0) to match attributes {artifactTypeandroid-classes-jar, org.gradle.categorylibrary, org.gradle.libraryelementsjar, org.gradle.statusrelease, org.gradle.usa…

LeeCode前端算法基础100题(11)-移除元素

一、问题详情: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明…

pycharm手动安装ini插件

pycharm中新增pytest.ini文件时发现&#xff0c;文件的图标不是配置文件的图标 原因是没有安装ini插件 安装插件的方式有很多种&#xff0c;今天通过去官网下载插件&#xff0c;再安装的方式 第一步&#xff1a;去官网搜索&#xff0c;地址是&#xff1a;https://plugins.jet…

使用深度学习的微光图像和视频增强:综述

1INTRODUCTION 微光图像增强&#xff08;LLIE&#xff09;旨在提高在光照较差的环境中捕获的图像的感知或可解释性。该领域的最新进展主要是基于深度学习的解决方案&#xff0c;其中采用了许多学习策略、网络结构、损失函数、训练数据等。在本文中&#xff0c;我们提供了一个全…

Python办公自动化 -- Excel和Word的操作运用

Python办公自动化 – Excel和Word的操作运用 文章目录 Python办公自动化 -- Excel和Word的操作运用前言一、如何使⽤Python操作Excel⽂件二、使用步骤1.使⽤openpyxl库2.使⽤pandas库 二、如何使⽤Python操作Word⽂档1. python-docx2.python-docx2txt3. pywin324. docxtemplate…

将包上传到 npm

将包上传到 npm 1.注册一个 npm 账号2.初始化包目录3.登录 npm4.构建包5.发布包6.注意事项 1.注册一个 npm 账号 在https://www.npmjs.com 上注册一个npm账号 2.初始化包目录 npm init这将引导你完成一些设置&#xff0c;如包名称、版本、描述等。按照提示输入相关信息。中间…

直流电、交流电和发电机、接地、变压器

直流电 此节内容主要摘录自&#xff1a;图文详解直流电与直流电路基本知识 直流电是指电流方向不随时间作周期性变化&#xff0c;由正极流向负极&#xff0c;但电流的大小可能会变化的电流。直流电可以分为稳定&#xff08;恒定&#xff09;直流和脉动直流两种&#xff0c;如下…

单片机应用实例:LED显示电脑电子钟

本例介绍一种用LED制作的电脑电子钟&#xff08;电脑万年历&#xff09;。其制作完成装潢后的照片如下图&#xff1a; 上图中&#xff0c;年、月、日及时间选用的是1.2寸共阳数码管&#xff0c;星期选用的是2.3寸数码管&#xff0c;温度选用的是0.5寸数码管&#xff0c;也可根据…

KafKa手动提交问题描述

KafKa手动提交offset问题描述 在分布式架构&#xff0c;我在XXJOB来进行调用接口产生数据&#xff0c;将数据提交KafKa进行存储&#xff1b;然后将KafKa中数据拿出来消费&#xff0c;在处理KafKa出来的数据时&#xff0c;调用另外一个服务时&#xff0c;正好另外一个服务挂了&…

UE5中C++对蓝图类的软引用方法

静态方法&#xff1a; 对资源的软引用&#xff1a; FSoftObjectPath MeshSoftRef("StaticMesh/Game/StarterContent/Props/SM_Door.SM_Door"); 对类的软引用&#xff1a; FSoftClassPath bpwidgetcalss(TEXT("Blueprint/Game/bp_widget.bp_widget_C"…

饥荒Mod 开发(十七):手动保存和加载,无限重生

饥荒Mod 开发(十六)&#xff1a;五格装备栏 饥荒游戏会自动保存&#xff0c;本来是一个好的机制&#xff0c;但是当角色死亡的时候存档会被删除&#xff0c;又要从头开始&#xff0c;有可能一不小心玩了很久的档就直接给整没了&#xff0c;又或者是打怪没爆好东西&#xff0c; …

LVS最终奥义之DR直接路由模式

1 LVS-DR(直接路由模式) 1.1 LVS-DR模式工作过程 1.客户端通过VIP将访问请求报文&#xff08;源IP为客户端IP&#xff0c;目标IP为VIP&#xff09;发送到调度器 2.调度器通过调度算法选择最适合的节点服务器并重新封装数据报文&#xff08;将源mac地址改为调度器的mac地址&am…