FunTester Groovy 语境下的 Map

FunTester · 2022年08月16日 · 3108 次阅读

Groovy 中的 Map,不仅兼容了 Java API 提供的各种功能,还拓展了许多特殊语法和功能方便测试人员在使用的过程中提高效率,更快地构建测试脚本。

下面我就从几个方面分享一下 Groovy Map 的神奇之处。

创建

Java 中通常创建一个 Map 的常用语法Map<Integer, Integer> map = new HashMap();。而在 Groovy 中,我们可以使用语法[k:v]来创建 Map。相当于给 Map 对象初始化赋值了,而且语法简洁了许多。

Groovy 创建 Map 语法def map = [:],同样我们可以在初始化赋值def map = [a:32,b:32043],Groovy 中默认使用的是java.util.LinkedHashMap类,如果我们想改成java.util.HashMap实现,可以使用 as 关键字def map = [a:32,b:32043] as HashMap

添加

让我们从定义一个 Map 开始def map = [:]

下面向 Map 中添加一组值map["FunTester"] = 32432

还可以使用.运算符完成这个操作map.FunTester = 32423

换句话说,Groovy 支持以类似 bean 的方式访问键值对。

如果我们的 key 是一个变量,可以使用下面的语法:

def map = [(DEFAULT_STRING):432423]
map[DEFAULT_STRING] = 324324

当然如果你足够熟悉 Groovy 的话,可以使用一下语法添加def map1 = map + [c: 324],是不是有点神奇,这个可以翻看我之前的文章Groovy 重载操作符(终极版)

获取

有了添加的经验,我们可以总结 Groovy 中获取 value 的两种方式:

def map = [a: 32, b: 32043] as HashMap
output(map.a)
output(map["a"])

删除

首先我们想到的还是 Java API 提供的方法,这也是我自己常用的,不过当看完下面的演示,相信会有一部分人改变自己的看法。

def map = [a: 32, b: 32043] as HashMap
def map1 = map - [a: 32]
output(map1)

在 Groovy 中-运算符被重载成了删除功能,如果 key 和 value 不一致,那则不会被删除。如果后面 key-value 是多个,则相当于把每一个 key-value 遍历一遍。

如果我们想批量删除符合规则的元素,Groovy 完成胜任这项工作:

map.removeAll {it.value % 2 == 0}

Groovy 还提供一个 API 来保留符合规则的元素:

map.retainAll {it.value % 2 == 1}

遍历

对于 Groovy 遍历来讲,使用each准没错的,语法如下:

map.each {
    output("key:$it.key value:$it.value")
}

如果我们还想获取节点的 index 信息的话,可是使用eachWithIndex,如下:

map.eachWithIndex {entry, i ->
    output("index:$i key:$entry.key value:$entry.value")
}

过滤

这里有三种 API,分别是:

map.grep {it.value == 32}
map.find {it.value == 32}
map.findAll {it.value > 0}

其中第三种返回的是个 list,返回的是所有符合条件的。对于第一种来说,不常用,最重要的是 Intellij 并不支持语法提示,这会造成相当的困扰。

还有一部分更加复杂的 API,这里就不演示了。使用 Groovy 就是为了简洁提效,不需要为了学习而学习花式炫技的语法,一旦时过境迁,自己会对自己的代码感觉陌生。

FunTester原创专题集锦

阅读原文,跳转我的仓库地址

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册