【问题标题】:obtaining Groovy map value by key按键获取 Groovy 映射值
【发布时间】:2017-08-11 09:33:41
【问题描述】:

我是一个完全的 groovy 菜鸟,我有这张简单的地图:

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

并给定一个分支名称(密钥),我想获得端口号,最好在一行代码中。奇怪的是,互联网上有大量示例可以根据其相应的值获取密钥,但反之则不然。

【问题讨论】:

  • 您应该以小写字符开头命名变量。有些地方,groovy 解析器会假设一个类,而你最终会遇到非常奇怪的错误。

标签: groovy


【解决方案1】:

假设分支名称是唯一的,您可以编写一个简单的方法来返回给定分支名称的端口

def port(String branchName) {
    BranchToPort.find { it['branch'] ==  branchName }?.get("port")
}

只是为了解释你提到的这里发生了什么“我是一个完全的 groovy noob”

  • def port(String branchName) 在这里我们声明了一个接受字符串值branchName 的方法
  • BranchToPort.find 因为 BranchToPort 是 groovy collection,我们可以使用 .find,它接受一个闭包,由花括号表示。此闭包将对集合中的每个项目执行,find 的功能是它将返回第一个 匹配 项目。
  • it['branch'] == branchName 这是我们闭包中的“让我找到符合此条件的第一个项目”。集合中的项目使用it 引用。这里我们访问"branch" 键并检查该值是否与输入branchName 匹配。
  • }['port'] 最后访问密钥以提取值。
  • ?.get("port") 在 Royg 评论后编辑。我们使用安全的空检查器? 并尝试访问“端口”值。 ? 将防止空指针异常。

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

希望这会有所帮助。

[编辑] 忘了放一个调用方法的例子:

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

【讨论】:

  • 将查找更改为:BranchToPort.find { it['branch'] == branchName }?.get("port")。通过这样做,您不会在不存在的分支上获得 NPE。
【解决方案2】:

实际上,您没有 a 地图,您有一个包含两个条目的地图的列表。如果您想创建一个单独的 Map,其中键和端口号的分支名称作为相应的值,您可以这样做:

def branchPorts = BranchToPort.collectEntries { [it.branch, it.port] }

The collectEntries method 在这里发挥了作用,它遍历 List 中的每个项目,根据提供的闭包参数转换每个元素,并将闭包结果附加到 Map 实例,最终由方法返回。

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

一旦您创建了地图,获取端口就是使用分支名称作为键的标准地图查找:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-06
    • 2011-06-18
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多