ZetCode

Groovy 条件语句

最后修改于 2025 年 4 月 5 日

条件语句允许程序根据布尔表达式做出决策。Groovy 提供了几种条件结构,包括 if/else、switch 和三元运算符。这些结构根据条件控制程序流程。

基本定义

条件语句评估布尔表达式以确定代码执行路径。Groovy 支持标准的 Java 条件语句,并进行了额外的增强。主要的条件结构是 if/else、switch/case 和 ?: 运算符。

Groovy 的条件语句可以处理“真值”,其中非 null/非零值被评估为 true。这与 Java 严格的布尔值要求不同。

简单的 if 语句

if 语句在条件为 true 时执行代码。

IfExample.groovy
def age = 18

if (age >= 18) {
    println "You are an adult"
}

这会检查 age 是否大于等于 18。如果为 true,则打印消息。条件必须评估为布尔值。Groovy 允许真值评估。

单条语句的 {} 是可选的,但为了清晰起见建议使用。条件必须放在括号中。

$ groovy IfExample.groovy
You are an adult

if-else 语句

当条件为 false 时,if-else 语句提供了一个替代的执行路径。

IfElseExample.groovy
def temperature = 25

if (temperature > 30) {
    println "It's hot outside"
} else {
    println "It's not too hot"
}

这会检查 temperature 并根据值打印不同的消息。当 if 条件为 false 时,else 块执行。

else 语句必须紧跟在 if 块之后。可以使用 else-if 链式处理多个条件。

$ groovy IfElseExample.groovy
It's not too hot

if-else-if 级联

可以使用 else-if 语句检查多个条件。

IfElseIfExample.groovy
def score = 85

if (score >= 90) {
    println "Grade A"
} else if (score >= 80) {
    println "Grade B"
} else if (score >= 70) {
    println "Grade C"
} else {
    println "Grade D"
}

这会将 score 与多个等级阈值进行比较。第一个为 true 的条件会执行其代码块,并跳过其他条件。

条件是从上到下评估的。即使有多个条件为 true,也只有一个代码块会被执行。

$ groovy IfElseIfExample.groovy
Grade B

三元运算符

三元运算符提供了一种简洁的方式来编写简单的 if-else 语句。

TernaryExample.groovy
def age = 20
def status = age >= 18 ? "Adult" : "Minor"

println status

如果 age 大于等于 18,则将 "Adult" 赋给 status,否则赋给 "Minor"。语法是 condition ? trueValue : falseValue。

三元表达式返回一个值,并且可以用于赋值或方法参数。它们非常适合简单的条件。

$ groovy TernaryExample.groovy
Adult

Switch 语句

switch 语句将一个值与多个 case 进行比较。

SwitchExample.groovy
def day = "Wednesday"

switch(day) {
    case "Monday":
        println "Start of work week"
        break
    case "Friday":
        println "Almost weekend"
        break
    default:
        println "Midweek day"
}

这会检查 day 变量与不同的 case。匹配的 case 会执行其代码块。如果没有 case 匹配,则执行 default。

Groovy 的 switch 比 Java 的更强大,支持各种匹配策略。break 语句可防止“贯穿”到下一个 case。

$ groovy SwitchExample.groovy
Midweek day

Switch 语句支持范围

Groovy 的 switch 语句支持在 case 语句中使用范围匹配。

SwitchRangeExample.groovy
def score = 75

switch(score) {
    case 90..100:
        println "Excellent"
        break
    case 75..<90:
        println "Good"
        break
    case 60..<75:
        println "Average"
        break
    default:
        println "Needs improvement"
}

这使用范围运算符匹配 score 范围。 .. 创建一个包含两端的范围,而 ..< 在上界是排他的。

范围匹配简化了数值比较,如果使用 if 语句则需要多个条件。

$ groovy SwitchRangeExample.groovy
Good

Switch 语句支持正则表达式

Groovy 的 switch 语句可以与正则表达式进行匹配。

SwitchRegexExample.groovy
def input = "admin@example.com"

switch(input) {
    case ~/.*@admin\..*/:
        println "Admin email"
        break
    case ~/.*@example\.com/:
        println "Example domain"
        break
    default:
        println "Unknown email"
}

~/pattern/ 语法创建了一个正则表达式匹配器。输入会与每个模式进行检查,直到找到匹配项。

在 switch 语句中使用正则表达式匹配是 Groovy 特有的,对于字符串模式匹配非常强大。

$ groovy SwitchRegexExample.groovy
Admin email

Switch 语句支持类型检查

Groovy 的 switch 语句可以检查输入值的类型。

SwitchTypeExample.groovy
def value = 3.14

switch(value) {
    case Integer:
        println "Integer number"
        break
    case Float:
        println "Float number"
        break
    case Double:
        println "Double number"
        break
    default:
        println "Unknown type"
}

这会检查 value 的运行时类型是否与类类型匹配。当 value 是指定类型的实例时,匹配的 case 会执行。

在 switch 语句中使用类型检查,可以在不显式使用 instanceof 检查的情况下,根据输入类型实现多态行为,非常有用。

$ groovy SwitchTypeExample.groovy
Double number

真值评估

Groovy 使用真值规则评估条件中的非布尔值。

TruthyExample.groovy
def name = "John"
def count = 0
def list = []

if (name) println "Name has value"       // true
if (count) println "Count is non-zero"   // false
if (list) println "List has elements"    // false

在 Groovy 中,非 null/非空/true 值被评估为 true。零、空集合、null 和 false 被评估为 false。

这与 Java 不同,Java 中条件必须严格为布尔值。这使得 Groovy 代码在进行常见检查时更加简洁。

$ groovy TruthyExample.groovy
Name has value

Elvis 运算符

Elvis 运算符 ?: 为 null 引用提供默认值。

ElvisExample.groovy
def username = null
def displayName = username ?: "Guest"

println "Welcome, $displayName"

如果 username 为 null,则将其赋值为 "Guest"。语法是 value ?: defaultValue。它类似于用于 null 检查的三元运算符的简写形式。

Elvis 运算符常用于提供备用值,并安全地处理 null,而无需冗长的 if-else 块。

$ groovy ElvisExample.groovy
Welcome, Guest

来源

Groovy 条件语句文档

本教程涵盖了 Groovy 的条件结构以及实际示例。条件语句是控制 Groovy 中程序流程的基础。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 Groovy 教程