Groovy语言学习

介绍

Groovy 是一种基于 JVM 的敏捷开发语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性。

Groovy 主要的特点包括:

  • 是一个基于 Java 虚拟机的敏捷动态语言
  • 构建在强大的 Java 语言之上 并添加了从 Python、Ruby 和 Smalltalk 等语言中学到的诸多特征
  • 为 Java 开发者提供了现代最流行的编程语言特性,而且学习成本很低(几乎为零)。
  • 支持 DSLDomain Specific Languages 领域定义语言)和其它简洁的语法,让你的代码变得易于阅读和维护。
  • Groovy 拥有处理原生类型,面向对象以及一个 Ant DSL ,使得创建 Shell Scripts 变的非常简单。
  • 在开发 Web,GUI,数据库或控制台程序时 通过减少框架性代码 大大提高了开发者的效率。
  • 支持单元测试和模拟(对象),可以简化测试
  • 无缝集成 所有已经存在的 Java 对象和类库
  • 直接编译成 Java 字节码,这样可以在任何使用 Java 的地方使用 Groovy 。

语法

语法特性

语句

  • 语句不需要分号表示结束

  • return 关键字可省略,方法的最后一句表达式可作为返回值返回

  • 导航操作符 ( ?. )可帮助实现对象引用不为空时方法才会被调用

  • 可以给参数设置默认参数

class Student {static void main(String[] args){println getMax(5);}   static def getMax(a,b=2){if(a > b){1;}else {0;}}
}

变量定义

如果是使用内置变量类型定义的变量,一经定义,后面是不可以更改变量类型的。但是Groovy也提供了类似javascript中的any定义任意变量类型的关键字def。而且不需要强制指定类型

task testGroovy() {def i = 1           //不需要指定类型println(i)
}

定义类

Groovy兼容Java,定义类就和Java一样了,类中成员变量会隐式生成get/set方法,最后观察打印方法的调用,在Groovy中方法调用可以省略"()"

默认类和方法是public,字段是private

task testGroovy() {// 类中字段赋值Project p = new Project("groovy", "1.0.0", "jvm")// 打印版本号println p.version
}class Project {//自动生成get/setString nameString versionString groupProject(String name, String version, String group) {this.name = namethis.version = versionthis.group = group}
}

字符串

Groovy有三种定义字符串的方式:

task testGroovy2() {def s = 'hello'             //单引号println s
}
task testGroovy2() {def s1 = 'hello'def s2 = "$s1 groovy"    //双引号,支持变量。和kotlin一样,可以使用 $ 符号取变量值println s2
}
task testGroovy3() {// 三个单引号,可以换行def s = '''hello groovyissimple'''println s
}

集合

定义list时使用 [] ,使用 <<添加一个元素

task testGroovy4() {def list = ['one', 'two', 'three']            //定义 listlist << 'four'								//添加元素。println list[3]
}

map使用 : 隔开,区别keyvalue,也支持 <<添加一个元素

task testGroovy5() {def map = ['one': 1, 'two': 2, 'three': 3]map << ['four': 4]println map['four']println map.four
}

range

def list1 = 1..10   //从 1 到 10 
def list2 = 1..<10  //从 1  到 9
def list3 = 'a'..'x'  // 从 a 到 x
def list4 = 10..1    // 从10 到 1 
def list5 = 'x'..'a'

闭包

闭包是一个短的匿名代码块。每个闭包会被编译成继承 groovy.lang.Closure 类的子类,这个类有一个叫 call 方法,通过该方法可以传递参数并调用这个闭包。lambda表达式表示的变量,也就是函数类型变量

task testGroovy6() {def print1 = { message ->                   // lambdaprintln "$message end"}print1 "hello"
}

循环

// 第一种循环:eachdef list = [1,2,3,4,5]list.each {println it}// 第二种循环:infor  ( i  in  0..2 ) {println("hello Groovy")}// 第三种循环3.times {println("hello Groovy")}// 第四种循环0.upto(2) {println("hello Groovy")}// 除此之外,java的while也支持

正则

def reg1 =~ 'he*llo'
def reg2 = /he*llo/
println "类型是: ${reg1.class}"          // 类型是: java.util.regex.Pattern
println "类型是: ${reg2.class}"          // 类型是: java.lang.String
println "hello".matches(reg1)            // true
println "hello".matches(reg2)            // true
  • =~ 可以得到 java.util.regex.Matcher
  • ==~ 可以得到布尔类型
def val1 = "hello" =~ "he*llo"            //左边是变量,右边是正则
println val1.class                        // java.util.regex.Matcher
print val1.matches()                      // truedef val2 = "hello" ==~ "he*llo"
print val2                                // true

Traits 特征

Scala 等语言更有详细描述。

with语法(闭包实现)

Groovy 中的这个 with 方法跟 Kotlin 中的 apply 方法类似,它使用了闭包:

class Name {String firstName;String secondNamestatic void main(String[] args) {def name = new Name()name.with {firstName = "XXXX"secondName = "YYYYY"println "$firstName $secondName"}}
}

with 方法中的这个闭包,可以直接使用 firstName 这个成员变量,也可以使用内部中的 public 方法。

委托

上述 with 方法之所以能够调用对象中的成员变量和方法,是因为它改变了委托策略。

闭包中的委托有三个重要的概念,它们分别是 this \ owner \ delegate。它们的区别是:

  • this:闭包定义处 外部的类 或者 这个类 对象。
  • owner:闭包定义处 外部的类或者类对象 或者外层的闭包对象
  • delegate:可以是任何对象,默认 owner

命令链功能

Groovy 可以省略顶级语句方法调用中参数外面的括号命令链功能则将这种特性继续扩展,它可以将不需要括号的方法调用串接成链,既不需要参数周围的括号,链接的调用之间也不需要点号

//没有参数的必须加括号
//每个方法都必须返回 this,类似于builder模式。
methodA a,b  methodB c  methodC()  methodD d,e,f 

数据类型

  • byte -这是用来表示字节值。例如2。
  • short -这是用来表示一个短整型。例如10。
  • int -这是用来表示整数。例如1234。
  • long -这是用来表示一个长整型。例如10000090。
  • float -这是用来表示32位浮点数。例如12.34。
  • double -这是用来表示64位浮点数,这些数字是有时可能需要的更长的十进制数表示。例如12.3456565。
  • char -这定义了单个字符文字。例如“A”。
  • Boolean -这表示一个布尔值,可以是true或false。
  • String -这些是以字符串的形式表示的文本。例如,“Hello World”。

数值类型的数值范围与Java一致。

运算符

算术运算符:+-*/%++--

关系运算符:==!=>>=<<=

逻辑运算符:&& || !

位运算符:& | ^ ~

赋值运算符: += -= *= /= %=

范围运算符:..

三元预算法:?:def result = a != null ? a : "name" 简化成 def resultA = a ?: "name"

Groovy 中的 == 操作符等价于使用 equals 方法,该方法可以复写,地址比较用 is 方法

一切皆可转化为Boolean

任何为 nullVoid的对象,或者等同于 0 或者为 null 的值,都会被解析为 false,反之则为 true

所以一般对 String 判断可以从 str != null && str.length() > 0 可以改为 !str

参考

API文档

下载地址

在线编程

常用类

Json

groovy.json.JsonOutput

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

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

相关文章

探索Viper-适用于GoLang的完整配置解决方案

前言 对于现代应用程序&#xff0c;尤其大中型的项目来说&#xff0c;在程序启动和运行时&#xff0c;往往需要传入许多参数来控制程序的行为&#xff0c;我们可以通过命令行参数&#xff0c;环境变量&#xff0c;配置文件等方式来将参数传递给程序。而Viper库为Golang语言开发…

麒麟系统安装minio_centos8.0安装最新minio_离线安装minio并设置权限_创建桶---minio工作笔记001

https://www.minio.org.cn/?id=18&id=3&id=0&id=11&id=9&spinz=qianfeng&adinfo678=baidu&spinz=qianfeng&adinfo678=baidu%3E 首先去到官网去下载minio,然后 可以看到已经显示的官网,然后再去,右边点击下载 进入下载页面一般都是amd64的版本…

如何在事务方法里,执行一段事物提交之后的代码

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){Overridepublic void afterCompletion(int status) {//业务方法}} }); TransactionSynchronizationManager.registerSynchronization有以下的&#xff0c;根据你业务去重写即可 …

【JaveWeb教程】(35)SpringBootWeb案例之《智能学习辅助系统》登录功能的详细实现步骤与代码示例(8)

目录 案例-登录和认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 案例-登录和认证 在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能…

Leetcode3014. 输入单词需要的最少按键次数 I

Every day a Leetcode 题目来源&#xff1a;3014. 输入单词需要的最少按键次数 I 解法1&#xff1a;统计 统计字符串 word 的小写字母个数和 1、#、*、0 的个数。 将小写字母均匀地分配到 8 个按键上&#xff0c;模拟即可。 代码&#xff1a; /** lc appleetcode.cn id3…

【Vue】1-5、Source Map

一、简介 Source Map 就是一个信息文件&#xff0c;里面存储着位置信息。 也就是说&#xff0c;Source Map 文件中存储着压缩混淆后的代码所对应的转换前的位置。 有了它&#xff0c;出现错误的时候将直接显示原始代码&#xff0c;而不是转换后的代码&#xff0c;能够极大的…

多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-LSTM多变量时间序列预测&#x…

K8s 安装部署-Master和Minion(Node)

K8s 安装部署-Master和Minion(Node) 操作系统版本&#xff1a;CentOS 7.4 Master &#xff1a;172.20.26.167 Minion-1&#xff1a;172.20.26.198 Minion-2&#xff1a;172.20.26.210&#xff08;后增加节点&#xff09; ETCD&#xff1a;172.20.27.218 先安装部署ETCD y…

手机通讯录----Python实例练习

问题描述 通讯录是记录了联系人姓名和联系方式的名录&#xff0c;手机通讯录是最常见的通讯录之一&#xff0c;人们可以在通讯录中通过姓名查看相关联系人的联系方式、邮箱、地址等信息&#xff0c;也可以在其中新增联系人&#xff0c;或修改、删除联系人信息。下面是一个常见…

静态分析Golang语言生成函数调用关系的利器——go-callvis

目录 升级go删除旧版本安装新版本配置环境变量载入环境修改当前环境修改之后进入的环境 分析安装go-callvis分析其他包总结 导出文件总结 清晰主体脉络总结 其他 参考资料 不同于之前分析C语言项目的工具&#xff0c;go-callvis还是很方便使用。只要把两项工作做好就能顺利的使…

图像处理------调整色调

什么是色调&#xff1f; 色调&#xff0c;在画面上表现思想、感情所使用的色彩和色彩的浓淡。分为暖色调和冷色调。 from cv2 import destroyAllWindows, imread, imshow, waitKey#创建棕褐色色调 def make_sepia(img, factor: int):pixel_h, pixel_v img.shape[0], img.shap…

如何使用Docker部署WBO白板并实现公网地址远程访问

本文主要是如何使用Docker部署WBO白板并实现公网地址远程访问的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&am…

【C/C++】C/C++编程——变量和常量

文章目录 变量变量的声明变量命名规则变量的类型 常量常量的定义与初始化字面量常量整型常量浮点型常量字符常量常量表达式&#xff08;constexpr&#xff09; 大家好&#xff0c;我是 shopeeai&#xff0c;也可以叫我虾皮&#xff0c;中科大菜鸟研究生。今天我们来一起来学习C…

C++初阶:C/C++内存管理、new与delete详解

之前结束了类与对象&#xff1a;今天进行下面部分内容的学习 文章目录 1.C/C内存分布2.C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3.C动态内存管理方式3.1new/delete操作内置类型3.2new和delete操作自定义类型 4.operator new与operator delete函数5.new和…

C#,数据检索算法之三元搜索(Ternary Search)的源代码

数据检索算法是指从数据集合&#xff08;数组、表、哈希表等&#xff09;中检索指定的数据项。 数据检索算法是所有算法的基础算法之一。 本文发布 三元搜索&#xff08;Ternary Search&#xff09;的源代码。 1 文本格式 using System; namespace Legalsoft.Truffer.Algo…

SpringMvc切换Json转换工具

SpringBoot切换使用goolge的Gson作为SpringMvc的Json转换工具 <!-- gson依赖 --> <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId> </dependency>Configuration public class JsonWebConfig {B…

Python拼接字符串

在Python编程中&#xff0c;字符串拼接是一项常见的操作&#xff0c;它可以用于将多个字符串连接起来形成一个新的字符串&#xff0c;是处理文本数据和字符串操作的基本技巧之一。 1. 使用""运算符进行字符串拼接 最常见的字符串拼接方法是使用""运算符&…

多维时序 | Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预测

多维时序 | Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预测 目录 多维时序 | Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-GRU蜣螂算法优化门控循环单元多变量时间序列预…

专业130+总分390+第二名中国海洋大学946信号与系统考研经验电子信息通信

今年专业946信号与系统130&#xff0c;总分390&#xff0c;专业排名第2顺利上岸中国海洋大学&#xff0c;总结一下自己的复习经验希望对大家复习有所帮助&#xff0c;每个人的学习习惯不同&#xff0c;大家要对自己有信心&#xff0c;借鉴加上自己整合&#xff0c;属于自己的才…

第十篇【传奇开心果系列】BeeWare开发移动应用示例:优质跨平台解决方案

传奇开心果博文系列 系列博文目录BeeWare开发移动应用示例系列博文目录前言一、Beeware优质跨平台实现方案三、跨平台能力示例代码和说明四、原生用户界面示例代码和说明五、强大生态系统示例代码和说明六、灵活的部署选项示例代码和说明七、归纳总结系列博文目录 BeeWare开发…