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。

可参考:Groovy 条件语句_w3cschool

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

6. 参考资料

  1. Top 22 Groovy Interview Questions & Answers (2022 Update)
  2. Groovy 运算符_w3cschool
  3. The Apache Groovy programming language - Differences with Java
  4. Groovy - Documents
  5. The Apache Groovy programming language - Documentation
  6. Groovy-条件语句-w3cschool
  7. Groovy-列表-w3cschool
posted on 2022-05-22 22:42  hchengmx  阅读(1010)  评论(0编辑  收藏  举报