Groovy程序设计-【第一部分Groovy起步】-02-面向Java开发者的Groovy

news2025/1/9 1:04:30

前言:

知识点记录来源于【Groovy程序设计】一书中,本文仅作知识点记录供日后使用查询,不做教程使用。


groovy支持java语法,并且保留了java的语义,所以我们可以随心所欲的混用两种语言

1.从Java到Groovy

先看一个简单的java代码的for循环,使用groovyConsole运行一下,如下:
在这里插入图片描述
可以看出简单的循环,“无用”的java代码可真多,实际上在groovy中,去掉每一行的分号也是被允许的。

注意:这里先说明,groovy代码编写的时候不必导入所有的常用类和包,例如,使用Calendar使用可以毫无困难的引入,同时groovy自动导入下列包:java.lang、java.util、java.io和java.net 等等。还会导入java.math.BigDecimal和java.math.BigInteger两个类等,此外,还导入了groovy.lang和groovy.util这些Groovy包。

同时,在groovy中,去掉类和方法的定义也是可以的,上面的java循环使用groovy改造后如下:

 for (int i = 0; i < 3; i++) {
     // 注意,代码最后没有分号了哦
     System.out.print("ho ")
 }
 System.out.println("Merry Groovy!!!")

甚至可以更进一步,groovy理解 println()方法,因为该方法添加到了java.lang.Object中了,同时groovy还有一个使用Range对象的更为轻量级的for循环,而且groovy对括号也很“不在意”,因此最终循环代码可以如下:

for(i in 0..2) {
    print 'ho '
}
println 'Merry Groovy!'

比java代码更简单明了!

1.1.实现循环的方法

上面用到了for循环以及改造为range 0…2 的方法,但是groovy还提供了更多更优雅的迭代方式。

比如 upto(),这是groovy在java.lang.Integer类中添加的一个便于使用的实例方法,可用于迭代,如下:
在这里插入图片描述
在 0 上调用了 upto(),这里的0就是Integer的是一个实例,输出现实的是所选范围内的每个值,0 1 2。
代码中的 $it 代表的是,上下文中进行循环时的索引值,后续会具体说明,这里只需要知道即可。it前面的 $ 表示让print()打印该变量的值,而不是it这两个字符。

使用 uptp()方法时,可以设置范围的上限和下限,如果范围从0开始,可以使用times(),例如上面的0.uptp(2),可以改为如下:

3.times {
 print "$it "
}

结果会和 0.upto(2)相同的结果,0 1 2

要在循环时跳过一些值,可以使用 step()方法, 如下:
在这里插入图片描述
最后,我们再回顾从Java到Groovy中的for range循环的groovy示例,是不是也可以写成下面这样:

3.times {print "ho "}
println "Merry Groovy!"

1.2.代码中执行命令

String扩展了execute()方法,当执行的时候,groovy创建了一个扩展了java.lang.Process的类的实例,执行实例如下:

print "svn help".execute().text

调用text时,实际是在调用groovy在类Process类上添加的getText()方法,功能就是将该进程的标准输出到一个String对象中。除了svn help,还可以执行如下:

print "groovy -v".execute().text
print "ls -l".execute().text

注意:如果你是win系统,执行这些命令是不行的(linux和unix可以),明确的说需要调用cmd命令(语法也不同,例如ls需要改成dir),例如:

print "cmd /c groovy -v".execute().text

1.3.操作符?.

经常检查对象引用是否为null?groovy可以使用?.进行判断,如下:

def foo(str){
    // if (str != null) {str.reverse()}
	str?.reverse()
}
println foo('evil')
println foo(null)

操作符 ?. 只有在引用不为null的时候才会调用执行的方法或属性,运行结果如下:

live
null

1.4.异常处理

java开发中,必须强制处理编译异常,例如Thread的sleep()方法,必须处理InterruptedException异常,File的处理必须处理FileNotFoundExcetion,如下:
在这里插入图片描述

但是groovy不需要,groovy中如果不想处理异常,groovy会默认自动传递给调用者由调用者进行处理,如下:
在这里插入图片描述
没有任何异常捕获处理和抛出,由调用者处理异常,如下:
在这里插入图片描述
如上,捕获指定的异常使用catch即可,但是如果想要捕获所有的异常而不是某一个,可以如下:
在这里插入图片描述
使用catch(ex),ex前面没有任何类型,这样就可以捕获所有的异常了,但是需要注意,ex不会捕获Exception之外的Error或Throwable,如果需要,使用 catch(Throwable throwable)

2.可选形参

groovy中的可选形参必须位于方法参数列表的末尾,定义可选形参,需要在形参列表上给它赋一个值,如下,方法log()中有一个可选的base形参,如果不提供实参,groovy认为它的默认值就是10:

def log(x, base=10){
  ...
}
// 调用log
println log(1024)
println log(1024, 10)
println log(1024, 2)

groovy还会把末尾的数组形参作为是可选的,这其实就相当于java中的可变参数,如下:

def task(name, String[] details){
   println "$name - $detailds"
}
// 调用
task('Call')
task('Call', '123')
task('Call', '123', '456')
task('Call', '123', '456', '789')
// 输出结果
Call - []
Call - [123]
Call - [123, 456]
Call - [123, 456, 789]

从输出结果可以看出,groovy把末尾的参数(除了name参数之外的所有剩余参数)收集起来了赋值给数组。

3.使用多赋值

向方法传递参数获取方法的返回,如果希望方法返回多个结果,这很实用,groovy可以从方法返回的多个结果一次性赋值给多个变量,我们可以让方法返回一个数组,然后左侧用多个变量逗号分割,放在圆括号中接收即可。

其实这个类似于java中的Pair<left, right>的用法,但是java中的Pair需要自己get然后赋值,groovy不需要而且更简洁,如下:

// 空格分割参数, 返回数组
def splitname(fullname){ fullname.split(' ' )}
// 左侧两个变量接收
def (firstname, lastname) = splitname('James Bond')
// 打印结果
println "$firstname - $lastname"

结果输出:

James - Bond

可以发现,你都不用创建变量firstname和lastname,直接使用接受即可。

还可以使用该特性交换变量,不用创建中间变量过度了,如下:

def name1 = "test1"
def name2 = "test2"

println "name1:$name1, name2:$name2"

// 交换,注意上面已经定义了name1和name2,这里直接()即可,外面无需追加def再次定义
(name1, name2) = [name2, name1]
println "交换之后:"
println "name1:$name1, name2:$name2"

结果输出:

name1:test1, name2:test2
交换之后:
name1:test2, name2:test1

注意:如果左边变量个数 和 右侧数组的个数 不一致,groovy会这样处理,左侧的多余变量置为null,右侧的多余值被丢弃。

4.实现接口

在groovy中可以把一个映射或一个代码块转化为接口,因此可以快速直线带有多个方法的接口。这里使用线程Thread的执行举例,如下:

// 模拟java创建线程并执行
new Thread(() -> {
     println("线程执行1");
 }).run();

使用groovy:

new Thread(println("线程执行2") as Runnable).run()

看到了吗,groovy不需要Runabled的方法声明(java8开始出现了lambda),也不需要匿名内部类的实例,借助 as 操作符,相当于实现了Runabled接口。

上面是一个方法的实现,如果多个方法的接口中,只打算实现其中的某些方法而不是全部(只关心自己需要的方法),其实也很简单,只需要创建一个映射,以每个方法的名字作为键,方法对应的代码块作键值,同时用 冒号(:)分割方法名和代码块即可,如下(截图):
在这里插入图片描述

5.布尔求值

。。。进行中。。。休息,休息一下!!!

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

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

相关文章

vr兽医设备操作模拟仿真教学平台提升教学效果

在兽医教育的传统领域中&#xff0c;动物诊疗一直是一项不可或缺的实践环节。然而&#xff0c;传统的解剖教学方式受限于动物数量、种类以及安全隐患&#xff0c;无法充分满足学生的学习需求。随着VR虚拟仿真技术的不断精进&#xff0c;VR动物诊疗仿真实训系统为兽医教育带来了…

数字藏品app开发

数字藏品是指使用区块链技术&#xff0c;对应特定的作品、艺术品生成的唯一数字凭证。在保护其数字版权的基础上&#xff0c;数字藏品实现了真实可信的数字化发行、购买、收藏和使用。数字藏品是数字出版物的一种新形态&#xff0c;具有唯一的IP数字身份和所有权信息&#xff0…

什么是人才测评工具?

人才测评工具是指企业通过一系列科学的手段和方法对人的基本素质及其潜能进行测量和评定的活动。它的具体对象不是抽象的人&#xff0c;而是作为个体存在的人其内在素质及其表现出的绩效。随着经济的发展&#xff0c;企业对人才的渴求日益增加&#xff0c;这也导致各企业单位人…

Java与Kotlin语言的特色之处

一、Java特色之处&#xff1a; 1.多异常捕获 一个try块可能捕获到多个异常&#xff0c;可以使用多个catch块分别处理每个异常&#xff0c;也可以使用一个catch块处理多个异常&#xff08;多个异常使用管道符|分隔&#xff09;。 多个catch块代码&#xff1a; try{ }catch(IOExc…

海外仓管理系统的“实用性”讨论:没办法自由设置信息的,都是伪功能

和很多经营海外仓的企业都聊过这样一个问题&#xff1a;对于海外仓的管理系统&#xff0c;到底什么样的设计&#xff0c;什么样的功能才是真的有价值的。 那这就不得不说到一个概念&#xff1a;自由性。什么意思呢&#xff0c;海外仓看似都一样&#xff0c;大家都在经营仓储、…

基于Springboot+Vue的Java项目-口腔管理平台系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

5种语言实现 | 使用Dijkstra算法从起点到所有节点找到最短路径

编辑&#xff1a;东岸因为一点人工一点智能 5种语言实现 | 使用Dijkstra算法从起点到所有节点找到最短路径C\x5cJava\x5cPython\x5cC#\x5cJavascript&#xff0c;五种语言实现使用Dijkstra算法从起点到所有节点找到最短路径https://mp.weixin.qq.com/s/6NAClr51zR_GLZGyKkr32A…

RTT学习

中断管理 什么是中断&#xff1f;简单的解释就是系统正在处理某一个正常事件&#xff0c;忽然被另一个需要马上处理的紧急事件打断&#xff0c;系统转而处理这个紧急事件&#xff0c;待处理完毕&#xff0c;再恢复运行刚才被打断的事件。生活中&#xff0c;我们经常会遇到这样…

本地部署运行大模型ollama

本地部署运行大模型ollama ollama模型下载地址 在我使用 vscode 开发时&#xff0c;使用 coplit 或 chatgpt 来辅助过于昂贵&#xff0c;于是我希望找到一个可以调用本地大模型的工具来辅助编程。 ollama 就是这样一个工具。 ollama使用 ollama 是一个可以将训练好的模型部署到…

前端开发攻略---在页面上渲染大量元素,使用defer减少白屏等待时间,优化页面响应速度

1、优化前 2、优化后 3、优化思路 1、在元素数量不变的情况下&#xff0c;进行一步一步的渲染&#xff0c;先渲染一些重要的元素或者需要用户第一时间看到的元素。 2、使用Hooks封装优化函数 4、优化代码 拥有大量元素的组件&#xff08;Item&#xff09;&#xff1a;文件位置&…

嵌入式系统中的嵌入式主板,你了解多少?

嵌入式主板&#xff0c;也称为嵌入式计算机主板&#xff0c;是一种专门设计用于嵌入式系统的计算机主板。与台式机和笔记本电脑中使用的常规主板不同&#xff0c;嵌入式主板设计用于集成到更大的电子设备中&#xff0c;例如汽车、医疗设备或自动售货机。在本文中&#xff0c;我…

C++ ─── 类和对象(构造函数和析构函数)

目录 1.类的6个默认成员函数 2. 构造函数&#xff08;对类进行 “初使化”&#xff09; 2.1 概念 2.2 特性 3.析构函数&#xff08;对类进行 “销毁”&#xff09; 3.1 概念 3.2 特性 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真…

stable diffusion基本原理

diffusion model latent diffusion &#xff1a;先对图片降维&#xff0c;然后在降维空间做diffusion&#xff1b;stable diffusion即基于此方法实现的&#xff0c;因此计算量很小&#xff1b; 共用降噪网络U-Net&#xff1a;输入noisy imagestep&#xff0c;告诉网络当前的噪声…

Redis入门到通关之Redis缓存数据实战

文章目录 ☃️什么是缓存?❄️❄️为什么要使用缓存❄️❄️如何使用缓存 ☃️缓存实战❄️❄️缓存模型和思路❄️❄️演示代码 ☃️缓存更新策略❄️❄️数据库缓存不一致解决方案 ☃️什么是缓存? 缓存就像自行车,越野车的避震器 举个栗子: 越野车,山地自行车,都拥有&qu…

5个常见的前端手写功能:New、call apply bind、防抖和节流、instanceof、ajax

实现New 首先创建一个新的空对象设置原型&#xff0c;将对象的原型设置为函数的prototype对象让函数的this指向这个对象&#xff0c;执行构造函数的代码判断函数的返回值类型&#xff0c;如果是值类型&#xff0c;返回创建的对象。如果是引用类型&#xff0c;就返回这个引用类…

四维轻云|如何使用场景在线协作功能?

众所周知&#xff0c;四维轻云是一款轻量化的地理空间数据管理云平台&#xff0c;支持地理空间数据的在线管理、编辑以及分享。平台有项目管理、数据上传、场景搭建、发布分享、素材库等功能模块。现在&#xff0c;就为大家介绍一下如何使用场景协作编辑功能。 1、协作模式开启…

【Redis 神秘大陆】004 高可用集群

四、Redis 高可用和集群 当你发现这些内容对你有帮助时&#xff0c;为了支持我的工作&#xff0c;不妨给一个免费的⭐Star&#xff0c;这将是对我最大的鼓励&#xff01;感谢你的陪伴与支持&#xff01;一起在技术的路上共同成长吧&#xff01;点击链接&#xff1a;GitHub | G…

最新!!又5本On Hold无情被踢!!还剩11本期刊调查ing

【SciencePub学术】众所周知&#xff0c;期刊如果被打上“On Hold”的标签&#xff0c;就说明该期刊正在被进行调查评估&#xff0c;后面如果调查出期刊存在问题的话&#xff0c;则会被WOS期刊目录剔除&#xff01; 4.15号&#xff0c;科睿唯安官方更新了4月的SCI/SSCI期刊目录…

API数据应用场景电商运营选品API接口接入key获取演示

在电商运营中&#xff0c;API&#xff08;应用程序接口&#xff09;数据可以用于各种场景&#xff0c;特别是在选品过程中。以下是一些API数据应用场景&#xff0c;以帮助电商运营进行更有效的选品&#xff1a; 市场趋势分析&#xff1a;通过调用第三方数据提供商的API&#xf…

2023 中国 SDS 年度报告发布:XSKY 蝉联对象存储软件第一,整体 TOP5

近日&#xff0c;IDC 发布了《IDC China SDS Market Overview&#xff0c; 2023》市场报告&#xff0c;XSKY 星辰天合继续蝉联对象存储软件第一&#xff0c;文件存储保持领先地位&#xff0c;并且在中国市场整体 SDS 排名第五&#xff0c;也是 TOP5 里面唯一的专业 SDS 厂商。 …