Groovy脚本的认识和语法
转:()
简介:
Groovy是 Apache 旗下的⼀门基于 JVM 平台的动态/敏捷编程语⾔,在语⾔的设计上它吸纳了 Python、Ruby 和 Smalltalk 语⾔的优秀特性,语法⾮常简练和优美,开发效率也⾮常⾼(编程语⾔的开发效率和性能是相互⽭盾的,越⾼级的编程语⾔性能越差,因为意味着更多底层的封装,不过开发效率会更⾼,需结合使⽤场景做取舍)。并且,Groovy 可以与 Java 语⾔⽆缝对接,在写 Groovy 的时候如果忘记了语法可以直接按Java的语法继续写,也可以在 Java 中调⽤ Groovy 脚本,都可以很好的⼯作,这有效的降低了 Java 开发者学习Groovy 的成本。Groovy 也并不会替代 Java,⽽是相辅相成、互补的关系,具体使⽤哪门语⾔这取决于要解决的问题和使⽤的场景。
数据类型绑定:
在 Groovy 中,调⽤的⽅法将在运⾏时被选择。这种机制被称为运⾏时分派或多重⽅法(multi-methods),是根据运⾏时实参(argument)的类型来选择⽅法。Java 采⽤的是相反的策略:编译时根据声明的类型来选择⽅法。
下⾯是⼀个例⼦,同样的 Java 代码在 Java 和 Groovy 环境中运⾏结果是不同的.
int method(String arg) {
return 1;
}
int method(Object arg) {
return 2;
}
Object o = "Object";
int result = method(o);
// In Java
assertEquals(2, result);
/
/ In Groovy
assertEquals(1, result);
产⽣差异的原因在于,Java 使⽤静态数据类型,o 被声明为 Object 对象,⽽ Groovy 会在运⾏时实际调⽤⽅法时进⾏选择。因为调⽤的是 String 类型的对象,所以⾃然调⽤ String 版本的⽅法。
基本语法:
Groovy 定义变量的⽅式和 Java 是类似的,区别在于 Groovy 提供了def关键字供使⽤,它可以省略变量类型的定义,根据变量的值进⾏类型推导。
def a = 123
def b = 'b'
def c = true
boolean d = false
int e = 123
如果定义变量的字⾯量值为数字时,类型会根据数字的⼤⼩⾃动调整
def a = 1
assert a instanceof Integer
// Integer.MAX_VALUE
def b = 2147483647
assert b instanceof Integer
// Integer.MAX_VALUE + 1
def c = 2147483648
assert c instanceof Long
// Long.MAX_VALUE
def d = 9223372036854775807
assert d instanceof Long
// Long.MAX_VALUE + 1
def e = 9223372036854775808
assert e instanceof BigInteger
对于浮点型字⾯量为了精度 Groovy 默认使⽤的类型为 BigDecimal
def decimal = 123.456
Class() // class java.math.BigDecimal
Groovy为 数字类型提供⼀种更简单的声明类型的⽅式:类型后缀
- Integer 使⽤I或i
- Long 使⽤L或l
- BigInteger 使⽤G或g
-
BigDecimal 使⽤G或g
- Double 使⽤D或d
- Float 使⽤F或f
使⽤例⼦
def a = 123I
assert a instanceof Integer
def b= 123L
assert b instanceof Long
字符串
在Groovy种有两种字符串类型,普通字符串(java.lang.String)和插值字符串(groovy.lang.GString)。普通字符串使⽤单引号
println 'hello'
插值字符串使⽤双引号
def name = '张三'
println "hello $name"
除此之外,还⽀持三单引号的写法,可以保留⽂本的换⾏及缩进格式
def strippedFirstNewline = '''line one
line two
line three
'''
println strippedFirstNewline
// 可以写成下⾯这种形式,可读性更好
def strippedFirstNewline2 = '''\
line one
line two
line three
'''
println strippedFirstNewline2
字符
在 Groovy 中并没有明确的字符字⾯量表⽰形式,需要显⽰的指定,有三种⽅式
char c1 = 'A' // 声明类型
assert c1 instanceof Character
def c2 = 'B' as char // ⽤as关键字
assert c2 instanceof Character
def c3 = (char) 'C' // 强制类型转换
assert c3 instanceof Character
⽅法(函数)
Groovy ⽅法的默认访问修饰符是public,⽅法的返回类型可以不需要声明,但需添加def关键字。有返回值的⽅法return可以被省略,默认返回最后⼀⾏代码的运⾏结果,如果使⽤了return关键字则返回指定的返回值。
String method1() {
return 'hello'
}
assert method1() == 'hello';
def method2() {
return 'hello'
}
assert method2() == 'hello';
def method3() {
'hello'
}
assert method3() == 'hello';
Groovy ⽅法的参数类型可以被省略,默认为Object类型。
def add(int a, int b) {
return a + b
}
//与上⾯的等价
def add(a, b) {
a + b
}
Groovy ⽅法的其他特性与Java⼀样,⽐如⽀持重载、不定长参数(...)等。
bigdecimal转换为integer
Lists
Groovy 定义 List 的⽅式⾮常简洁,使⽤中括号([]),以逗号(,)分隔元素即可。Groovy中的 List 其实就是java.util.List,实现类默认使⽤的是java.util.ArrayList。
def numbers = [1, 2, 3]
assert numbers instanceof List
assert numbers.class == java.util.ArrayList
assert numbers.size() == 3
Arrays
Groovy 定义数组的语法和 List ⾮常类似,区别在于数组的定义必须指定类型为数组类型,可以直接定义类型或者使⽤def定义然后通过as 关键字来指定其类型。
String[] arrStr = ['Ananas', 'Banana', 'Kiwi'] //直接声明类型为数组类型  String[]
assert arrStr instanceof String[]
assert !(arrStr instanceof List)
def numArr = [1, 2, 3] as int[]    //痛过as关键字指定类型为数组类型 int[]
assert numArr instanceof int[]
assert numArr.size() == 3
Maps
Groovy 定义 Map 的⽅式⾮常简洁,通过中括号包含key、val的形式,key和value以冒号分隔([key:value])。Groovy中的Map其实就
是java.util.Map,实现类默认使⽤的是java.util.LinkedHashMap。
// key虽然没有加引号,不过Groovy会默认将其转换为字符串
def colors = [red: '#FF0000', green: '#00FF00', blue: '#0000FF']
assert colors['red'] == '#FF0000' // 使⽤中括号访问
== '#00FF00' // 使⽤点表达式访问
colors['pink'] = '#FF00FF' // 使⽤中括号添加元素,相当于Java Map 的 put(key,value)⽅法
assert colors.pink == '#FF00FF'
assert colors['yellow'] == '#FFFF00'
assert colors instanceof java.util.LinkedHashMap // 默认使⽤LinkedHashMap类型
// Groovy Map的key默认语法不⽀持变量,这⾥的key时间上是字符串'keyVal'⽽不是keyVal变量的值'name'
def keyVal = 'name'
def persons = [keyVal: 'Guillaume']
assert !ainsKey('name')
ainsKey('keyVal')
//要使⽤变量作为key,需要使⽤括号
def keyVal = 'name'
def persons = [(keyVal): 'Guillaume']
ainsKey('name')
assert !ainsKey('keyVal')

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。