Java Vs Groovy
Java Vs Groovy
函数的默认参数
Grooy可以设置函数参数的默认值。例如
def salute(message="hello!") {println message}
salute()
salute("Hi donkey")
执行结果如下:
hello!
Hi donkey
boilerplate code生成器
groovy.transform下提供了一系列的Annotation可修改AST从而在现有的代码基础上生成新的代码。
Annotation | Description |
---|---|
@EqualsAndHashCode | 可生成equals和hashCode方法 |
@TupleConstructor | 生成Constructor参数为Class中定义的Field,参数顺序按照Class中定义Field的顺序 |
@ToString | 生成toString方法 |
@Canonical | 包含@EqualsAndHashCode, @TupleConstructor和@ToString |
正则表达式
Groovy中可用/…/来定义正则表达式。
- ==~ /…/ 是否匹配
- =~ /…/ 返回Match对象。从而可通过Group等取得详细的匹配信息。
例如:
def mailPattern = ~/([\w.]+)@([\w.]+)/
def isMail = 'adam@email.com' ==~ mailPattern
println isMail
def mailMatch = 'adam@email.com' =~ mailPattern
if(mailMatch.find())println mailMatch.group(1)
执行结果如下:
true
adam
数组
Java总对于数组是没有forEach方法的,Groovy进行增强提供了each方法,类如
['foo', 'bar'].toArray().each{println it}
执行结果如下:
foo
bar
可省略的分号
Groovy 中默认情况下以行为单位表示语句的结束。换句话说对于Java必须的分号在groovy中是可选的。
需要注意的是当使用fluent API时,需要以 xxxx.的形式来编码。例如:
class Pie{
def bake(){this}
def make(){this}
def eat(){this}
}
def pie = new Pie().
make().
bake().
eat()
// The following syntax will be comile error
// def pie = new Pie()
// .make()
// .bake()
// .eat()
函数调用中可省略的括号
在函数调用中,Groovy可省略括号。
-
当有参数时。无参数时不可省略。
// call a method named "doStuff" with parameter 1 doStuff 1 //call "doStuff" with three parameters: doStuff 1, 2, 3
-
当Closure是最后一个参数或者是唯一一个参数时
list.each { item -> doStuff(item) }
布尔值解析(和Javascript)一样
和Java中的明确的布尔类型定义不同,Groovy和javascript类似,在推导布尔值时,如下类型也可使用:
- 字符串.空字符串为False.
- 列表或者数组。空列表或者数组为False.
- 空指针.空指针为False
- 数值类型. 0 为false
Map类型
可以通过".key“的形式访问Map中的元素。
def key = "red"
def colors = [(key): 1, "blue":2, "Green":3]
println colors
执行结果如下:
[red:1, blue:2, Green:3]