ZetCode

Groovy 列表 grep 函数

最后修改于 2025 年 2 月 25 日

Groovy 中的 grep 函数是一个通用的工具,用于过滤和搜索列表中的元素。它允许您选择满足特定条件的元素,例如模式、类型或自定义逻辑。本教程将通过 15 个实际示例介绍 grep 函数。

Grep 的基本用法

grep 函数根据条件过滤列表。它返回一个新列表,其中仅包含满足条件的元素。

BasicGrep.groovy
def numbers = [1, 2, 3, 4, 5, 6]
def evenNumbers = numbers.grep { it % 2 == 0 }

println(evenNumbers)

此示例使用 grep 函数从列表中过滤偶数。

按类型过滤

您可以使用 grep 按特定类型过滤元素。

FilterByType.groovy
def mixedList = [1, "Groovy", 3.14, true, "Java"]
def strings = mixedList.grep(String)

println(strings)

此示例从混合列表中仅过滤字符串元素。

按正则表达式过滤

grep 可以过滤与正则表达式匹配的元素。

FilterByRegex.groovy
def words = ["apple", "banana", "cherry", "date"]
def aWords = words.grep(~ /a/)

println(aWords)

此示例过滤包含字母 "a" 的单词。

按范围过滤

您可以使用范围过滤特定范围内的元素。

FilterByRange.groovy
def numbers = [10, 20, 30, 40, 50]
def rangeFiltered = numbers.grep(20..40)

println(rangeFiltered)

此示例过滤范围在 20 到 40 之间的数字。

按自定义条件过滤

您可以使用闭包定义自定义过滤条件。

CustomCondition.groovy
def numbers = [1, 2, 3, 4, 5, 6]
def greaterThanThree = numbers.grep { it > 3 }

println(greaterThanThree)

此示例过滤大于 3 的数字。

过滤 Null 值

您可以使用 grep 从列表中过滤掉 null 值。

FilterNullValues.groovy
def mixedList = [1, null, "Groovy", null, 3.14]
def nonNullValues = mixedList.grep { it != null }

println(nonNullValues)

此示例从列表中删除 null 值。

按类过滤

您可以过滤属于特定类实例的元素。

FilterByClass.groovy
def mixedList = [1, "Groovy", 3.14, true]
def integers = mixedList.grep(Integer)

println(integers)

此示例从混合列表中仅过滤整数值。

按多个条件过滤

您可以在闭包中组合多个条件进行过滤。

MultipleConditions.groovy
def numbers = [1, 2, 3, 4, 5, 6]
def filtered = numbers.grep { it % 2 == 0 && it > 3 }

println(filtered)

此示例过滤大于 3 的偶数。

按集合过滤

您可以过滤包含在另一个集合中的元素。

FilterByCollection.groovy
def numbers = [1, 2, 3, 4, 5, 6]
def filterList = [2, 4, 6]
def filtered = numbers.grep(filterList)

println(filtered)

此示例过滤存在于另一个列表中的元素。

按带有索引的闭包过滤

您可以在过滤条件中使用元素的索引。

FilterWithIndex.groovy
def numbers = [10, 20, 30, 40, 50]
def filtered = numbers.grep { it, index -> index % 2 == 0 }

println(filtered)

此示例过滤偶数索引处的元素。

按对象属性过滤

您可以根据对象的属性过滤对象。

FilterByProperties.groovy
class Person {
    String name
    int age
}

def people = [
    new Person(name: "Alice", age: 30),
    new Person(name: "Bob", age: 25),
    new Person(name: "Charlie", age: 35)
]

def adults = people.grep { it.age >= 30 }

println(adults.name)

此示例过滤年龄为 30 岁及以上的个人。

按不区分大小写匹配过滤

您可以使用不区分大小写的匹配过滤字符串。

CaseInsensitiveMatch.groovy
def words = ["Apple", "banana", "Cherry", "Date"]
def aWords = words.grep(~ /(?i)a/)

println(aWords)

此示例过滤包含 "a" 或 "A" 的单词。

按负面条件过滤

您可以过滤不满足条件的元素。

NegativeCondition.groovy
def numbers = [1, 2, 3, 4, 5, 6]
def notEven = numbers.grep { !(it % 2 == 0) }

println(notEven)

此示例过滤非偶数的数字。

按自定义对象过滤

您可以根据对象中的自定义逻辑过滤元素。

CustomObjectFilter.groovy
class Filter {
    boolean isEven(n) { n % 2 == 0 }
}

def numbers = [1, 2, 3, 4, 5, 6]
def filter = new Filter()
def evenNumbers = numbers.grep(filter.&isEven)

println(evenNumbers)

此示例使用自定义对象过滤偶数。

按多个模式过滤

您可以过滤与多个模式中的任何一个匹配的元素。

MultiplePatterns.groovy
def words = ["apple", "banana", "cherry", "date"]
def patterns = [~ /a/, ~ /e/]
def filtered = words.grep { word ->
    patterns.any { word =~ it }
}

println(filtered)

此示例过滤包含 "a" 或 "e" 的单词。

使用 Grep 的最佳实践

来源

Groovy Grep 文档

在本教程中,我们通过 15 个实际示例探讨了 Groovy 中的 grep 函数。grep 函数是过滤和搜索列表的强大工具,可以更轻松地处理 Groovy 中的集合。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有多年的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面有八年以上的经验。

列出 所有 Groovy 教程