Groovy - 将列表扩展为闭包参数

Roy*_*ove 6 groovy closures dynamic-programming

是否有可能有一个列表并将其用作闭包签名的参数,而不是几个变量?原因是我必须从java代码调用一个闭包,而java代码不知道groovy闭包需要什么变量.

用一个例子可以更好地服务.

假设我有一个'闭包存储库',每个闭包可能有不同的签名.例如:

closures = [
    closureA: { int a, String b ->
        a.times {
            System.err.println(b);
        }
    },
    closureB: { int a, int b, String c ->
        (a+b).times {
            System.err.println(c);
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

然后我有一个方法,我正在暴露于我的java代码来调用这些闭包:

def tryClosureExpansion(String whichClosure, Object ... args) {
    def c = closures[whichClosure]
    c.call(args)     // DOESNT COMPILE !
}
Run Code Online (Sandbox Code Playgroud)

而Java我会像这样调用这个方法:

// these calls will happen from Java, not from Groovy
tryClosureExpansion("closureA", 1, "Hello");
tryClosureExpansion("closureB", 1, 5, "Hello more");
Run Code Online (Sandbox Code Playgroud)

请参见上面未编译的行.我觉得groovy是'groovy'足以处理这样的事情.任何可能会飞的替代品?

tim*_*tes 10

请问:

c.call( *args )
Run Code Online (Sandbox Code Playgroud)

工作?不是在计算机上测试它

  • 它应该工作.另外,只使用方法调用语法也应该起作用:`c(*args)`; 但你可以利用`call`方法并使用安全导航操作符,以防闭包不存在:`c?.call(*args)`(当然,这取决于你的设计,可能会抛出异常)这种情况可能是一个更好的主意). (2认同)
  • @RoyTruelove它被称为"传播运营商".它用于将某些内容应用于COllection中的多个条目,或者在这种情况下将列表[扩展为多个参数](http://jroller.com/aalmiray/entry/another_gem_from_groovy) (2认同)