Groovy语境下的Map

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原创专题集锦 - 接口功能测试专题 - 性能测试专题 - Groovy专题 - Java、Groovy、Go、Python - 单测&白盒 - FunTester社群风采 - 测试理论鸡汤 - FunTester视频专题 - 案例分享:方案、BUG、爬虫 - UI自动化专题 - 测试工具专题

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