Groovy:可以构建功能图吗?

时间:2018-09-03 13:58:17

标签: groovy jenkins-groovy

我有一个元素列表,我想构建一个映射,该列表中的每个元素都包含一个方法调用。例如:

list = ['a', 'b', 'c']
map = list.collectEntries{[it: println(it)]}
map[b]

>>b

由于两个问题,此方法不起作用:

  1. println在分配给地图中的键后立即被执行
  2. map[b]遇到错误:groovy.lang.MissingPropertyException: No such property: b for class: test

是否可以设置这样的映射,而无需立即执行命令?怎么办?

注意:我知道,我想要实现的目标听起来有些奇怪,但是我得到了一个方法,该方法将这样的映射作为参数然后运行命令,所以我没有其他选择,例如for-loops和东西

1 个答案:

答案 0 :(得分:2)

如果要在地图中存储函数并懒惰地求值,则必须将这些函数存储为闭包。考虑以下示例:

def list = ['a', 'b', 'c']
def map = list.collectEntries { el -> [(el): { println el }] }
map.b()

在这种情况下,仅在执行函数时才对函数求值,而现在将其分配给映射键时才求值。另外,您还必须使用el之类的显式名称参数,因为如果依赖it,则在访问闭包时它将更改上下文。

执行存储在地图中的功能的方法有多种。考虑以下表达式作为示例:

map.b()
map.b.call()
map['b']()
map['b'].call()
map.getAt('b').call()

如果要使函数执行NPE安全,那么以下表达式将是最佳选择:

map.getAt('b')?.call()

在这种情况下打电话

map.getAt('d')?.call()

不会引发任何异常。