我是一个完整的groovy菜鸟,我有这个简单的地图:
def BranchToPort = [
[branch: 'master' , port: 15565],
[branch: 'Release' , port: 15566],
[branch: 'Feature' , port: 15567],
[branch: 'Prototype', port: 15568],
[branch: 'HotFix' , port: 15569]
]
并给出一个分支名称(密钥)我想获取端口号,最好是在一行代码中。奇怪的是,互联网上有大量的例子可以根据相应的价值获得密钥,但不是相反。
答案 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] }