Groovy: 可以构建功能图吗?
Groovy: Possible to build map of functions?
我有一个元素列表,我想构建一个地图,该列表中的每个元素都有一个方法调用。例如:
list = ['a', 'b', 'c']
map = list.collectEntries{[it: println(it)]}
map[b]
>>b
由于两个问题,这不起作用:
println
分配给映射中的键时立即执行
map[b]
遇到错误:groovy.lang.MissingPropertyException:
No such property: b for class: test
是否可以设置这样的地图,而不立即执行命令?怎么做到的?
注意:我知道,我想要实现的目标听起来有点奇怪,但是我得到了一个方法,该方法将这样的地图作为参数然后运行命令,所以我没有其他选择,例如-循环和东西
如果你想在映射中存储函数并延迟计算它们,你必须将这些函数存储为例如闭包。考虑以下示例:
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()
不会抛出任何异常。
我有一个元素列表,我想构建一个地图,该列表中的每个元素都有一个方法调用。例如:
list = ['a', 'b', 'c']
map = list.collectEntries{[it: println(it)]}
map[b]
>>b
由于两个问题,这不起作用:
println
分配给映射中的键时立即执行map[b]
遇到错误:groovy.lang.MissingPropertyException: No such property: b for class: test
是否可以设置这样的地图,而不立即执行命令?怎么做到的?
注意:我知道,我想要实现的目标听起来有点奇怪,但是我得到了一个方法,该方法将这样的地图作为参数然后运行命令,所以我没有其他选择,例如-循环和东西
如果你想在映射中存储函数并延迟计算它们,你必须将这些函数存储为例如闭包。考虑以下示例:
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()
不会抛出任何异常。