代码之家  ›  专栏  ›  技术社区  ›  AracKnight

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

  •  1
  • AracKnight  · 技术社区  · 7 年前

    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循环之类的选项

    1 回复  |  直到 7 年前
        1
  •  4
  •   Szymon Stepniak    7 年前

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

    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()
    

    不会引发任何异常。