按键获取Groovy映射值

时间:2017-08-11 09:33:42

标签: groovy

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

只是为了解释这里发生了什么,因为你提到"我是一个完整的常规菜鸟"

  • 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

答案 1 :(得分:2)

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

$policyYear = 

Array
(
    [1] => 1 Year
    [2] => 2 Year
    [3] => 3 Year
)




<div>  
<?php
$options = $policyYear;
$attributes = array('legend' => false);
echo $this->Form->radio('policy_year', $options, $attributes);
?>
</div>

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

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

创建地图后,获取端口是使用分支名称作为关键字的标准地图查找:

{ [it.branch, it.port] }