Groovy:可以构建函数映射吗?

标签 groovy jenkins-groovy

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

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

>>b

由于两个问题,这不起作用:

  1. println 在分配给映射中的键时立即执行
  2. map[b] 遇到错误:groovy.lang.MissingPropertyException: 没有这样的属性:b for class: test

是否可以设置这样的 map ,而不立即执行命令?怎么做到的?

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

最佳答案

如果你想在映射中存储函数并延迟计算它们,你必须将这些函数存储为例如闭包。考虑以下示例:

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

在这种情况下,函数只有在执行时才会被评估,现在当它被分配给 map 键时。此外,您还必须使用显式名称参数,如 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()

不会抛出任何异常。

关于Groovy:可以构建函数映射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52151242/

相关文章:

json - 使用 Groovy 将字符串列表转换为 JSON

grails - 为什么 map.collectEntries() 不适用于此数据 [[Name :sub, Value:23234]] - Groovy

maven - 在 Jenkins 管道中使用 Maven 版本插件升级版本时出现错误替换错误

jenkins - Jenkins 管道中触发器指令的条件

Jenkins Groovy unix 脚本错误 java.lang.NoSuchMethodError : 'boolean mightBePositionalArgumentConstructor VariableExpression

groovy - 如何使用 groovy 中的文件进行 http 调用以上传文件并构建参数

grails - 保存域对象失败时默认 o.errors.allErrors.each { println it }

arrays - 带数组的 Groovy 简单函数

java-stream - Jenkins 管道脚本将文件复制或移动到另一个目的地

java - 如何使用 Groovy 脚本从给定目录获取所有 *.sln 文件?