Groovy学习记录(一)

为什么是Groovy?

要说Groovy一直都不是多火的东西,同时作为JVM上的语言,完全没有近年来谷歌强推的Kotlin火,但是学语言嘛,最重要的是开心,特别是工作中不是必须要用的语言。平常自己写一些辅助工作的小功能会用Java,像这类东西肯定是脚本语言更加适合,也自己学了一点热门的Python,但毕竟工作中一点都不用,想写个功能还得翻翻文档,而Java工作中常用,api根本不用看直接用,Python的效率优势反而没了,结果工作中常用的Java和JavaScript越来越熟练,Python就荒废了。但不得不说Java在写一些功能的时候是真的不爽,比如集合操作,工作中也写一点JavaScript,比较之下就更加不爽,之后Groovy在偶然的机会下就进入视线,试着用了一下,还真挺有意思,就开始想着认真学一下,要说自己为什么想学Groovy,大概就下面几点:

  • 脚本语言,直接写直接用
  • 兼容Java语法,学习曲线平滑
  • 介绍中看到DSL相关的东西,觉得能拿来做些有意思的东西
  • 看到有不少用Groovy给Java写单元测试的用法,感觉可以给工作上带来帮助

而且在网上还看到一个很有意思的说法,Groovy是真正的JavaScript,我也总结了一下:

虚假的JavaScript 真正的JavaScript
可以在各种浏览器上运行,靠v8引擎和node.js也可以在服务端运行,但就是不能在JVM上运行 在JVM上运行
语法与api和Java有相似之处,但也有大量不同的地方 可以直接写Java代码
动态语言 动态语言,但是可以设置静态编译,能屈能伸
蹭热度的名字,一开始叫LiveScript groovy:adj.时髦的; 吸引人的; 有趣的 包含美好的寓意

当然上面是开玩笑的,不过也体现出了Groovy吸引Java开发人员的地方。

快速开始

确实够快,因为做Java开发,肯定是有JDK的,只要再下载一个Groovy 50多M的包,解压之后把bin目录配置进Path变量就行了。
输入

1
groovy -v

展示了Groovy Java和系统版本,安装成功。
安装好之后就有命令行Groovy Shell和图形界面的Groovy Console可以用,也可以直接文本编辑器写groovy文件,例如:

1
print 'Hello World'

然后切换到文件所在目录输入命令

1
groovy hello.groovy

运行展示结果。

初步学习就是看官方文档,先把
Differences with Java

The Groovy Development Kit
这两篇看个差不多就可以开始写脚本了。
自己写了两个小东西,主要是处理xml配置文件的,用到了
Processing XML
里面介绍的XmlSlurper,用起来很爽,基本上就是

1
2
3
4
5
6
def list = new XmlSlurper().parseText(text) //解析xml文本
println list.technology.name //直接取值
println list.technology.@name //取属性
list.technology.each { it ->
println it.@name //直接遍历
}

就行了,简单愉快。
遍历目录:

1
2
3
4
//遍历所有文件和文件夹
new File('/path').eachFileRecurse { file ->
println file.name
}

定义集合与遍历集合:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//列表
def list = [5, 6, 7, 8]
list.each {
println "Item: $it"
}
//Map
def map = [name: 'Gromit', likes: 'cheese', id: 1234]
def map2 = [
simple : 123,
complex: [a: 1, b: 2]
]
map.each { key, value ->
println "key: $key val: $value"
}

舒服了。
还有个用的比较多的就是GString,Groovy中单引号是普通字符串,双引号是GString,可以直接用类似字符串模板的写法,上面已经出现过了:

1
2
3
4
def map = [name: 'Gromit', likes: 'cheese', id: 1234]
map.each { key, value ->
println "key: $key val: ${value.toUpperCase()}"
}

有了这些其实就已经能提高不少效率了,而且为什么说Groovy学习曲线平滑?因为有的地方如果不太熟悉Groovy的api,可以去翻文档,也可以直接上自己熟悉的Java写法搞定的,效率UP。

Groovy in Action

Groovy中文资料还是有点少,Groovy in Action第一版倒是有中文的,但那都是07年的书了,年代有点久远,所以干脆就直接挑战一下Groovy in Action 第二版的英文版,锻炼一下自己阅读英文书籍的能力。目前看完了Part1的第一章和第二章。
第一章基本就是Groovy大型广告,介绍了Groovy的故事,Groovy的使用场景,快速开始和支持Groovy的IDE与文本编辑器的介绍。
第二章也是介绍了Groovy的一些基础内容,到没有一上来就讲什么运算符数据类型之类了,而是讲了和Java语法的比较,assert的用法,还有一些GroovyBeans,注解,grapes,GStrings,正则表达式,数字,集合,闭包,流程控制语句大致的介绍,其中有一点就是Groovy中的数字类型也是对象,所以会看到

1
1.plus(2)

这种看着怪怪的写法。
接下来就是Groovy编译器相关的内容。这里说到了有意思的一点,Groovy虽然是动态语言,但是与用解释器逐行解释的动态语言不同,Groovy是经过编译器编译再运行的,但是编译之后又怎么做到动态语言的特性的呢?以调用方法为例子,编译后的文件里不是直接调用的,而是

1
getMetaClass().invokeMethod(this, "foo", EMPTY_PARAMS_ARRAY)

这样通过MetaClass对象进行调用,通过MetaClass对象可以实现动态语言的特性。
而使用注解

1
@CompileStatic

之后编译出来的文件就不去使用MetaClass对象调用方法。

总之趁着自己还有学习热情的时候多看点吧。


Groovy学习记录(一)
http://jgduhao.xyz/2019/07/07/Groovy学习记录(一)/
作者
jgduhao
发布于
2019年7月7日
许可协议