Groovy 常见用法
本文链接:https://www.cnblogs.com/hchengmx/p/16299391.html
最近在使用MeterSphere的时候,发现前置脚本可添加Groovy,于是简单了解了下Groovy语言,以及语言的使用方法。
1. 什么是Groovy
Groovy 是一种面向对象 和 Java语法兼容的变成语言,为Java平台构建。Groovy 代码可以被编译为 Java字节码,所以它可以运行在安装有 JRE的平台上。
Groovy可以在Java平台上用作为脚本语言。
2. Groovy的特性
优点
- 与所有的Java版本兼容,与Java极其相似;
- 支持动态和静态类型;
- 与Java相比,代码更简洁,对于开发人员来很简单;
- 可以用现有的Java库;
- 动态编译;
局限性
- 慢,需要大量的内存;
- 需要提前了解Java知识;
- 相对于Java,还有一些新的特性,比如闭包,默认类型;
3. Groovy变量
Java是强类型语言,意味着 变量的类型必须提前声明,而且在程序的运行过程中这个变量只能存储这个类型的数据。 。
所以在java平台上运行以下代码运行时,会报错
public class Demo {
public static void main(String args[]) {
int x = 104;
System.out.println(x);
x = "Guru99";
}
}
output
Demo.java:5: error: incompatible types: String cannot be converted to int
x = "Guru99";
而 Groovy支持动态类型,变量可以用关键字 "def" 定义,变量的类型不用事先声明。编辑器可以自动得到变量类型,甚至可以改变变量类型;
def x = 104
assert println x.getClass() == class java.lang.Integer
x = "Guru99"
println x.getClass()
output
class java.lang.Integer
class java.lang.String
3.1 String 变量内嵌
任何Groovy表达式都可以内嵌到String变量中。被替换的表达式用 {}
包起来。
例子
def name = 'Guillaume' // a plain string
def greeting = "Hello ${name}"
assert greeting.toString() == 'Hello Guillaume'
4. Groovy 关键字
Groovy所有的保留关键字参考:Syntax
以下挑几个部分:
4.1 range运算符
Groovy运算符与Java类似,支持 算术运算符/关系运算符/逻辑运算符/位运算符/赋值运算符 等。
其中比较特殊的是 范围运算符:range
举个例子:
def range = 5..10;
println(range);
pringln(range.get(2));
output
[5,6,7,8,0,10]
7
4.2 Loop 循环
与Java用法一致,支持 if/else/switch。
4.3 List 列表
参考:Groovy 列表_w3cschool
在Java语言中,可能是应用以下操作来初始化的
int[] array = {1, 2, 3}; // Java array initializer shorthand syntax
int[] array2 = new int[] {4, 5, 6}; // Java array initializer long syntax
但是在Groovy中,{...} 被用来闭包。所以 Groovy初始化跟Java有所不同,如下:
def y = ["Guru99", "is", "Best", "for", "Groovy"]
println y
y.add("Learning")
println(y.contains("is"))
println(y.get(2))
println(y.pop())
[Guru99, is, Best, for, Groovy]
true
Best
Learning
不过在 Groovy 3+的版本中,Groovy也支持用以下类似于Java的方法初始化
def array[] = new int {1,2 3}; // Groovy 3.0+ supports the Java-style array initialization long syntax
4.4 Array 数组
Array比较不同的是,初始化的时候需要指定Array的类型
String []arrStr = ['Ananas', 'Banana', 'Kiwi'];
assert arrStr == ['Ananas', 'Banana', 'Kiwi'];
def numArr = [1,2,3] as int[];
assert numArr == [1, 2, 3]
def primes = new int[] {2, 3, 5, 7, 11}
assert primes.size() == 5 && primes.sum() == 28
4.5 Map
4.5.1 Map的定义
Samples1
def map1 = [fName:'Jen', lName:'Cruise', sex:'F']
println map1.get("fName");
//define one empty map
def map2 = [:];
map2."key1" = "value1";
map2."key2" = "value2";
println map2.get("key1");
Jen
value1
4.5.2 Map遍历
Sample1:
def map = [name : 'Hubert', age : 36];
//iteration method 1
map.each{k, v -> println "${k}: ${v}"};
output
name: Hubert
age: 36
Sample2:
def map = [name : 'Hubert', age : 36];
//iteration method 2
for(e in map){
print "key = ${e.key}, value = ${e.value}"
output
key = name, value = Hubert
key = age, value = 36
Sample3:
def map = [name : 'Hubert', age : 36];
println "$map.name is $map.age years old"
output
Hubert is 36 years old
关于Map更多的用法可参考:
5. Groovy闭包
可以作为方法或者函数。
5.1 无参数的闭包
def myClosure = {
println "My First Closure"
}
myClosure()
Output
My First Closure
5.2 有参数的闭包
def myClosure = {
a,b,c->
return (a+b+c)
}
println(myClosure(1,2,3))
output
6