# Groovy 常用语法

Groovy 是一种基于 Java 平台的灵活编程语言,它结合了 Python、Ruby 和 Smalltalk 的许多强大特性。以下是一些 Groovy 的常用语法,帮助你快速上手。

# 变量声明

在 Groovy 中,变量声明可以使用 def 关键字,也可以显式指定类型。

// 使用 def 关键字
def name = "Groovy"

// 显式指定类型
String greeting = "Hello, ${name}!"

# 数据类型

Groovy 支持多种数据类型,包括整型、浮点型、布尔型和字符串等。

def a = 10          // 整型
def b = 10.5        // 浮点型
def c = true        // 布尔型
def d = "Groovy"    // 字符串

# 逻辑运算

Groovy 支持 &&(逻辑与)、||(逻辑或)、!(逻辑非)等逻辑运算符。

def a = 10
def b = 20

if (a > 0 && b > 0) {
    println "Both numbers are positive"
} else if (a > 0 || b > 0) {
    println "At least one number is positive"
} else {
    println "Both numbers are non-positive"
}

# 条件语句

Groovy 支持 if-elseswitch 条件语句。

def number = 10
if (number > 0) {
    println "Number is positive"
} else {
    println "Number is non-positive"
}

switch (number) {
    case 0:
        println "Number is zero"
        break
    case { it > 0 }:
        println "Number is positive"
        break
    default:
        println "Number is negative"
}

# 循环语句

Groovy 支持 forwhiledo-while 循环。

// for 循环
for (i in 0..9) {
    println i
}

// while 循环
def i = 0
while (i < 10) {
    println i++
}

// do-while 循环
def j = 0
do {
    println j++
} while (j < 10)

# 字符串

# 字符串拼接

在 Groovy 中,可以使用 + 运算符或者通过 ${} 语法进行字符串拼接。

def name = "Groovy"
def greeting = "Hello, " + name + "!"
println greeting  // 输出 Hello, Groovy!

def greeting2 = "Hello, ${name}!"
println greeting2  // 输出 Hello, Groovy!

# 字符串截取

可以使用 substring 方法来截取字符串的一部分。

def str = "Hello, Groovy!"
println str.substring(7)  // 输出 Groovy!
println str.substring(0, 5)  // 输出 Hello

# 字符串替换

可以使用 replace 方法来替换字符串中的内容。

def str = "Hello, Groovy!"
println str.replace("Groovy", "Java")  // 输出 Hello, Java!

# 字符串分割

可以使用 split 方法将字符串分割成数组。

def str = "Hello, Groovy!"
def parts = str.split(", ")
println parts[0]  // 输出 Hello
println parts[1]  // 输出 Groovy!

# 字符串分割与取值

可以使用 tokenize 方法将字符串分割成列表,并通过索引访问特定部分。

def str = "Hello, Groovy!"
println str.tokenize(",")[1]  // 输出 Groovy!

# 字符串修剪

可以使用 trim 方法去除字符串两端的空白字符。

def str = "  Hello, Groovy!  "
println str.trim()  // 输出 Hello, Groovy!

# 字符串长度

可以使用 length 属性获取字符串的长度。

def str = "Hello, Groovy!"
println str.length()  // 输出 14

# 字符串包含

可以使用 contains 方法判断字符串是否包含某个子字符串。

def str = "Hello, Groovy!"
println str.contains("Groovy")  // 输出 true

# 字符串查找

可以使用 indexOf 方法查找子字符串在字符串中的位置。

def str = "Hello, Groovy!"
println str.indexOf("Groovy")  // 输出 7

# 字符串比较

可以使用 ==!=<><=>= 等运算符进行字符串比较。

def str1 = "Hello, Groovy!"
def str2 = "Hello, Java!"
println str1 == str2  // 输出 false
println str1 != str2  // 输出 true
println str1 < str2  // 输出 true
println str1 > str2  // 输出 false
println str1 <= str2  // 输出 true
println str1 >= str2  // 输出 false

# 字符串转义

可以使用 \ 来转义特殊字符,如 \n 表示换行符。

def str = "Hello,\nGroovy!"
println str  // 输出 Hello,
             // Groovy!

# 字符串模板

Groovy 支持使用 ${} 语法在字符串中嵌入变量。

def name = "Groovy"
def greeting = "Hello, ${name}!"
println greeting  // 输出 Hello, Groovy!

# 字符串正则匹配

可以使用 ==~ 运算符进行正则匹配。

def emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
def str = "google@163.com"
println str ==~ emailPattern  // 输出 true

# 多行字符串

可以使用三个引号 """''' 定义多行字符串。

def multiLineStr = """
    This is a multi-line
    string in Groovy.
"""
println multiLineStr

# 列表(List)

在 Groovy 中,列表(List)是一种常用的数据结构,可以包含不同类型的元素。以下是一些 Groovy 列表操作的常用语法。

# 定义列表

可以使用方括号 [] 定义一个列表。

def list = [1, 2, 3, 'Groovy', true]

# 访问列表元素

可以通过索引访问列表中的元素,索引从 0 开始。

def list = [1, 2, 3, 'Groovy', true]
println list[3]  // 输出 Groovy

# 修改列表元素

可以通过索引修改列表中的元素。

def list = [1, 2, 3, 'Groovy', true]
list[3] = 'Java'
println list  // 输出 [1, 2, 3, 'Java', true]

# 添加元素

可以使用 add 方法或左移运算符 << 向列表中添加元素。

def list = [1, 2, 3]
list.add(4)
println list  // 输出 [1, 2, 3, 4]

list << 5
println list  // 输出 [1, 2, 3, 4, 5]

# 删除元素

可以使用 remove 方法从列表中删除元素。

def list = [1, 2, 3, 4, 5]
list.remove(0)
println list  // 输出 [2, 3, 4, 5]

# 列表长度

可以使用 size 方法获取列表的长度。

def list = [1, 2, 3, 4, 5]
println list.size()   // 输出 5

# 遍历列表

可以使用 for 循环遍历列表中的元素。

def list = [1, 2, 3, 4, 5]
for (item in list) {
    println item
}

# 列表切片

可以使用 subList 方法获取列表的一部分。

def list = [1, 2, 3, 4, 5]
println list.subList(1, 4)  // 输出 [2, 3, 4]

# 列表排序

可以使用 sort 方法对列表进行排序。

def list = [3, 1, 4, 2, 5]
println list.sort()  // 输出 [1, 2, 3, 4, 5]

# 列表反转

可以使用 reverse 方法对列表进行反转。

def list = [1, 2, 3, 4, 5]
println list.reverse()  // 输出 [5, 4, 3, 2, 1]

# 列表包含

可以使用 contains 方法检查列表是否包含某个元素。

def list = [1, 2, 3, 4, 5]
println list.contains(3)  // 输出 true
println list.contains(6)  // 输出 false

# 列表连接

可以使用 plus 方法或 + 运算符连接两个列表。

def list1 = [1, 2, 3]
def list2 = [4, 5, 6]
println list1.plus(list2)  // 输出 [1, 2, 3, 4, 5, 6]
println list1 + list2      // 输出 [1, 2, 3, 4, 5, 6]

# 列表清空

可以使用 clear 方法清空列表。

def list = [1, 2, 3, 4, 5]
list.clear()
println list  // 输出 []

# 映射(Map)

在 Groovy 中,映射(Map)是一种常用的数据结构,用于存储键值对。以下是一些 Groovy 映射操作的常用语法。

# 定义映射

可以使用方括号 [:] 或花括号 {} 定义一个映射。

def map = [:]
map = ["name": "Groovy", "version": 2.5]

# 访问映射元素

可以通过键访问映射中的值。

def map = ["name": "Groovy", "version": 2.5]
println map["name"]  // 输出 Groovy

# 修改映射元素

可以通过键修改映射中的值。

def map = ["name": "Groovy", "version": 2.5]
map["name"] = "Java"
println map  // 输出 [name:Java, version:2.5]

# 添加元素

可以使用 put 方法或直接赋值向映射中添加元素。

def map = ["name": "Groovy"]
map.put("version", 2.5)
println map  // 输出 [name:Groovy, version:2.5]

map["author"] = "James"
println map  // 输出 [name:Groovy, version:2.5, author:James]

# 删除元素

可以使用 remove 方法从映射中删除元素。

def map = ["name": "Groovy", "version": 2.5]
map.remove("version")
println map  // 输出 [name:Groovy]

# 映射大小

可以使用 size 方法获取映射的大小。

def map = ["name": "Groovy", "version": 2.5]
println map.size()  // 输出 2

# 遍历映射

可以使用 each 方法遍历映射中的键值对。

def map = ["name": "Groovy", "version": 2.5]
map.each { key, value ->
    println "${key}: ${value}"
}

# 检查键或值

可以使用 containsKeycontainsValue 方法检查映射中是否包含某个键或值。

def map = ["name": "Groovy", "version": 2.5]
println map.containsKey("name")  // 输出 true
println map.containsValue(2.5)  // 输出 true

# 清空映射

可以使用 clear 方法清空映射。

def map = ["name": "Groovy", "version": 2.5]
map.clear()
println map  // 输出 [:]

# 合并映射

可以使用 putAll 方法将一个映射中的所有元素合并到另一个映射中。

def map1 = ["name": "Groovy"]
def map2 = ["version": 2.5]
map1.putAll(map2)
println map1  // 输出 [name:Groovy, version:2.5]

# 获取所有键或值

可以使用 keySetvalues 方法获取映射中的所有键或值。

def map = ["name": "Groovy", "version": 2.5]
println map.keySet()  // 输出 [name, version]
println map.values()  // 输出 [Groovy, 2.5]

# 函数

在 Groovy 中,函数被称为方法(Method),可以定义在类中或作为脚本的一部分。以下是一些 Groovy 函数定义和调用的常用语法。

# 定义函数

可以使用 def 关键字定义一个函数。

def greet(name) {
    return "Hello, ${name}!"
}

# 调用函数

定义函数后,可以通过函数名和参数调用它。

def result = greet("Groovy")
println result  // 输出 Hello, Groovy!

# 带默认参数的函数

可以在定义函数时为参数提供默认值。

def greet(name = "World") {
    return "Hello, ${name}!"
}

println greet()        // 输出 Hello, World!
println greet("Groovy") // 输出 Hello, Groovy!

# 多个参数的函数

可以定义接受多个参数的函数。

def add(a, b) {
    return a + b
}

println add(3, 5)  // 输出 8

# 匿名函数

可以定义匿名函数,并将其赋值给变量或作为参数传递。

def multiply = { a, b -> a * b }
println multiply(3, 5)  // 输出 15

# 带可变参数的函数

可以定义接受可变数量参数的函数。

def sum(... numbers) {
    def total = 0
    for (number in numbers) {
        total += number
    }
    return total
}

println sum(1, 2, 3, 4)  // 输出 10

# 带闭包的函数

可以定义接受闭包(Closure)作为参数的函数。

def operate(a, b, closure) {
    return closure(a, b)
}

def add = { x, y -> x + y }
println operate(3, 5, add)  // 输出 8

# 返回多个值的函数

可以定义返回多个值的函数,返回值将作为一个列表。

def getCoordinates() {
    return [10, 20]
}

def (x, y) = getCoordinates()
println "x: ${x}, y: ${y}"  // 输出 x: 10, y: 20

# 递归函数

可以定义递归函数,即在函数内部调用自身。

def factorial(n) {
    if (n <= 1) {
        return 1
    } else {
        return n * factorial(n - 1)
    }
}

println factorial(5)  // 输出 120