groovy语言学习笔记
由于项目中使用gradle作为编译工具,而gradle又是使用groovy作为其书写语言,简单抽时间速度过了一遍groovy的主要用法。本文并不是该语言的学习指南,且不包含该语言的高级部分,主要是记录本人觉得一些关键语法点和见解,快速学习groovy的目的是使用gradle编译工具。个人感觉,groovy语法基本跟java大同小异(所以跟java语法基本一致的不会在本文中表述,比如继承、泛型、接口等等),同时又吸取了函数式编程的一些优点(多了不少语法糖,可以少写点代码)。瞬间觉得语言如果大一统多好,那么程序员就可以省点力了。
def
def可以用来定义变量和方法,该变量为动态类型,与java语言的强类型不同(编译器各变量类型已确定)。比如:
def s = "HelloWorld!"
这种定义方式跟scala中的val和var类似。但是java10的新版本也已经支持了变量推导功能,是用var直接定义变量,自动推导出变量类型。个人觉得这种使用虽然可以少写点类型定义,但是需要根据实际情况使用,上下文如果离的太远,那看代码的时候,不知道类型也是一件很痛苦的事情。
字符串
可以使用单引号,双引号和三引号将字符串扩起来,用法与scala相同。字符串类型拥有比较丰富的操作。
range
1..10可以定义一个1到10的数字范围的列表,跟scala 1 to 10类似。也支持'a'..'z'列出字母的列表(说列表有点牵强,实际上应该是range类型,range类型具有丰富的方法,比如toArray)
groovy:000> (1..10).toArray()
===> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
列表
跟java不同的地方在于支持异构数据存储在同一个列表中。比如:
['Groovy',21,2.11]
trait
跟scala中的trait用法基本相同(不由得想起Spark团队开发吐槽Flink抄袭Spark源码),算是对java不支持多继承的一种补偿。trait可以简单理解为可以实现具体方法的interface。我之前在scala中非常喜欢trait,因为通过trait可以将功能拆分得更细致,不会出现因为不支持多继承而导致父类过于膨胀或者继承自不同父类的子类具有重复方法这种情形出现。
闭包
这个没啥好说的,很多高级语言都有的特性。groovy定义完闭包后,需要主动调用call函数。不过由于动态语言的原因,函数中闭包作为参数传入不需要声明匿名函数的类型,这是比scala方便的地方。下面示例代码直接从网上拷的:
class Example {
def static Display(clo) {
// This time the $param parameter gets replaced by the string "Inner"
clo.call("Inner");
}
static void main(String[] args) {
def str1 = "Hello";
def clos = { param -> println "${str1} ${param}" }
clos.call("World");
// We are now changing the value of the String str1 which is referenced in the closure
str1 = "Welcome";
clos.call("World");
// Passing our closure to a method
Example.Display(clos);
}
}
模板引擎
非常方便地支持动态替换文本或者XML等配置文件中的占位符。groovy语言提供的特性。以下是如何使用XMLTemplateEngine的示例(代码网上直接拷过来的):
def binding = [StudentName: 'Joe', id: 1, subject: 'Physics']
def engine = new groovy.text.XmlTemplateEngine()
def text = '''
<document xmlns:gsp='http://groovy.codehaus.org/2005/gsp'>
<Student>
<name>${StudentName}</name>
<ID>${id}</ID>
<subject>${subject}</subject>
</Student>
</document>
'''
def template = engine.createTemplate(text).make(binding)
println template.toString()
如果上面的代码在groovy中执行,将显示以下输出:
<document>
<Student>
<name>
Joe
</name>
<ID>
1
</ID>
<subject>
Physics
</subject>
</Student>
</document>
命令行
groovy像scala一样支持了直接从命令行进行交互,自学groovy时比较方便。mac安装(其他系统的安装可以自行google):
brew install groovy
安装完成后直接groovysh运行:
% groovysh ~/IdeaProjects/springLearn
Groovy Shell (2.5.1, JVM: 1.8.0_171)
Type ':help' or ':h' for help.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
groovy:000> def a = 1
===> 1
groovy:000>
元对象编程
比较有意思的一个部分。主要思路是类通过继承实现GroovyInterceptable接口中的方法,可以动态的向实现类中添加属性和方法。好处就是类的定义更灵活了,对于某些无法改变实现类的场景中,用户可以动态的为该类添加属性。
JAVA互操作
由于groovy运行于jvm,且可以和java互操作,所以站在java的肩膀上(scala也是),还是非常有利于自己语言的发展。例如groovy也可以直接使用jmx监控java进程的运行状态。
DSL
待补充