Groovy脚本基础全攻略
Posted duangxcg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Groovy脚本基础全攻略相关的知识,希望对你有一定的参考价值。
1 背景
Groovy脚本基于Java且拓展了Java,所以从某种程度来说掌握Java是学习Groovy的前提,故本文适用于不熟悉Groovy却想快速得到Groovy核心基础干货的Java开发者(注意是Java),因为我的目的不是深入学习Groovy语言,所以本文基本都是靠代码来解释,这样最直观,同时也够干货基础入门Groovy的特点和结构。
开始介绍前先给一个大法,《官方权威指南》英文好的可以直接略过本文后续内容,我需要的只是Groovy皮毛;再次向Groovy的标志致敬,左手一个Java,右手一个Groovy,不好意思,我技术水平太Low了(T–T__《琅琊榜》看多了!!!)。
Groovy是一种动态语言,它和Java类似(算是Java的升级版,但是又具备脚本语言的特点),都在Java虚拟机中运行。当运行Groovy脚本时它会先被编译成Java类字节码,然后通过JVM虚拟机执行这个Java字节码类。
快速安装指南:
安装Groovy在各种Bash下都是通用的,具体如下命令就可搞定:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
我们在写Groovy代码时可以直接使用自己喜欢的文本编辑器编辑OK以后以.groovy后缀保存,然后在终端执行如下命令即可运行:
- 1
- 1
或者我们可以通过groovyConsole来进行groovy代码开发运行(由于不需要特别深入学习使用Groovy,所以个人非常喜欢这种模式的开发运行),如下图:
再或者我们还可以使用Intellij IDEA等工具安装groovy插件进行groovy开发,这里不再一一叙述了(配置环境点我),直接给出一个读取指定文件内容打印的例子,如下:
OK,有了上面这些简单粗暴的基础和环境之后那我们快速开战吧。
2 语法基础
这里开始我们就来快速简单粗暴的了解一下Groovy语法,其实和Java类似,但也有些区别,下面我们一步一步来看吧,切记对比学习,这才是秘笈。
2-1 注释
Groovy的单行注释、多行注释、文档注释基本都和Java一样,没啥特殊的,不再细说。只有一种特殊的单行注释需要留意一下即可。如下:
- 1
- 2
- 1
- 2
这种注释通常是用来给UNIX系统声明允许脚本运行的类型的,一般都是固定写法,没啥讲究的。
2-2 关键字
Groovy有如下一些关键字,我们些代码命名时要注意:
as、assert、break、case、catch、class、const、continue、def、default、do、else、enum、extends、false、finally、for、goto、if、implements、import、in、instanceof、interface、new、null、package、return、super、switch、this、throw、throws、trait、true、try、while
这玩意和其他语言一样,没啥特殊的,自行脑补。
2-3 标识符
对于Groovy的标示符和Java还是有些共同点和区别的,特别是引用标示符的区别,具体可以往下看。
2-3-1 普通标识符
普通标识符定义和C语言类似,只能以字母、美元符、下划线开始,不能以数字开头。如下例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
2-3-2 引用标识符
引用标识符出现在点后的表达式中,我们可以如下一样使用:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
当然了,Groovy的所有字符串都可以当作引用标示符定义,如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2-4 字符及字符串
Groovy有java.lang.String和groovy.lang.GString两中字符串对象类型,具体如下细说。
2-4-1 单引号字符串
单引号字符串是java.lang.String类型的,不支持站位符插值操作,譬如:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
Groovy的字符串可以通过”+“直接拼接,譬如:
- 1
- 1
其中涉及转义字符规则同Java,只用特殊注意”’“的转义即可。
2-4-2 三重单引号字符串
三重单引号字符串是java.lang.String类型的,不支持站位符插值操作,可以标示多行字符串,譬如:
- 1
- 2
- 3
- 1
- 2
- 3
三重单引号字符串允许字符串的内容在多行出现,新的行被转换为“\\n”
,其他所有的空白字符都被完整的按照文本原样保留;字符开头添加“/”
表示字符内容不转义反斜杠“\\”
,只有在反斜杠接下来是一个字符u的时候才需要进行转义,因为\\u
表示一个unicode转义。如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2-4-3 双引号字符串
双引号字符串支持站位插值操作,如果双引号字符串中不包含站位符则是java.lang.String类型的,如果双引号字符串中包含站位符则是groovy.lang.GString类型的。
对于插值占位符我们可以用$
或者$
来标示,$
用于一般替代字串或者表达式,$
主要用于A.B的形式中,具体如下例子:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
特别注意,$
只对A.B等有效,如果表达式包含括号(像方法调用)、大括号、闭包等符号则是无效的。譬如:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
注意,在表达式中访问属性前必须保证属性已经定义好(值为空也可以),如果使用了未定义的属性会抛出groovy.lang.MissingPropertyException异常。 GString还支持延迟运算,譬如在GString中使用闭包,闭包在调用GString的toString()方法时被延迟执行;闭包中可以有0或1个参数,若指定一个参数,则参数会被传入一个Writer对象,我们可以利用这个Writer对象来写入字符,若没有参数,闭包返回值的toString()方法被调用。譬如:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
上面了解了GString的推迟运算特性,下面我们再来看一个牛逼的特性,如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
可以看见,eagerGString是普通的双引号插值站位替换,lazyGString是双引号闭包插值替换,我们可以发现在number变为2以后他们的运算结果就有了差异。可以明显推理到结论,一个普通插值表达式值替换实际是在GString创建的时刻,一个包含闭包的表达式由于延迟运算调运toString()方法,所以会产生一个新的字符串值。
当然了,GString和String即使字符串一样他们的HashCode也不会一样,譬如:
- 1
- 1
由于相同字符串的String与GString的HashCode不同,所以我们一定要避免使用GString作为MAP的key,譬如:
- Android应用开发编译框架流程与IDE及Gradle概要