概述
转:(https://www.jianshu.com/p/e8dec95c4326)
简介:
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
println decimal.getClass() // 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一样,比如支持重载、不定长参数(...)等。
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' // 使用中括号访问
assert colors.green == '#00FF00' // 使用点表达式访问
colors['pink'] = '#FF00FF' // 使用中括号添加元素,相当于Java Map 的 put(key,value)方法
colors.yellow = '#FFFF00'// 使用点表达式添加元素
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 !persons.containsKey('name')
assert persons.containsKey('keyVal')
//要使用变量作为key,需要使用括号
def keyVal = 'name'
def persons = [(keyVal): 'Guillaume']
assert persons.containsKey('name')
assert !persons.containsKey('keyVal')
最后
以上就是动听棒棒糖为你收集整理的Groovy脚本的认识和语法简介:数据类型绑定:基本语法:的全部内容,希望文章能够帮你解决Groovy脚本的认识和语法简介:数据类型绑定:基本语法:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复