通过键获取Groovy地图值

4

我是一个完全不懂groovy的新手,我有一个简单的地图:

def BranchToPort = [
    [branch: 'master'   , port: 15565],
    [branch: 'Release'  , port: 15566],
    [branch: 'Feature'  , port: 15567],
    [branch: 'Prototype', port: 15568],
    [branch: 'HotFix'   , port: 15569]
]

给定一个分支名称(键),我想要获得端口号,最好只用一行代码。奇怪的是,在互联网上有很多关于根据相应值获取键的示例,但没有反向操作。


你应该使用小写字母开头来命名变量。在某些情况下,Groovy解析器会将其视为类,从而导致出现非常奇怪的错误。 - cfrick
2个回答

4
假设分支名称唯一,您可以编写一个简单的方法来返回给定分支名称的端口。
def port(String branchName) {
    BranchToPort.find { it['branch'] ==  branchName }?.get("port")
}

作为您提到的“我是一个完全的Groovy新手”的解释:

  • def port(String branchName) 在这里我们声明了一个方法,它接受一个字符串值branchName
  • BranchToPort.find 因为BranchToPort是一个Groovy集合,所以我们可以使用.find,它需要一个闭包来表示。这个闭包将在集合中的每个项上执行,find的功能是返回第一个匹配的项。
  • it['branch'] == branchName 这是我们在闭包中的"获取与此条件匹配的第一项"。使用it引用集合中的项。在这里,我们访问"branch"键并检查其值是否与输入的branchName匹配。
  • }['port'] 最后访问键以仅提取值。
  • ?.get("port") 在Royg的评论后进行了编辑。我们使用安全的空指针检查器?并尝试访问"port"值。 ?将防止空指针异常。

最后请注意,在Groovy中,方法将返回最后执行的语句,因此无需使用return或将方法中的语句分配给变量。

希望这可以帮助您。

[编辑]

忘记放一个调用该方法的示例:

portNumber = port("master")
assert portNumber == 15565
> True

1
将查找更改为:BranchToPort.find { it['branch'] == branchName }?.get("port")。这样做,您将不会在不存在的分支上得到NPE。 - Royg

2
实际上,你没有一个地图,而是一个包含两个条目的地图列表。如果你想要创建一个单一的地图,其中分支名称作为键,端口号作为相应的值,可以这样做:
def branchPorts = BranchToPort.collectEntries { [it.branch, it.port] }

这里的collectEntries方法起到了关键作用,它遍历列表中的每个项目,根据提供的闭包参数转换每个元素,并将闭包结果附加到一个Map实例中,最终由该方法返回。

闭包{ [it.branch, it.port] }进行了转换;它将列表中的每个Map转换为一个包含两个元素的列表。列表的第一个元素表示Map条目的键(分支名称),第二个元素表示Map条目的值(端口)。

创建了Map之后,使用分支名称作为键进行标准的Map查找即可获取端口:

assert branchPorts['master'] == 15565
assert branchPorts['HotFix'] == 15569

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接