在 Groovy 的闭包 - 正式定义中,它只是称为“将闭包传递给方法”。
Groovy 有一个特殊情况,用于将闭包定义为方法参数,以使闭包语法更易于阅读。具体来说,如果方法的最后一个参数是闭包类型,您可以使用括号外的显式闭包块调用该方法。例如,如果一个类有一个方法:
class SomeCollection {
public void each ( Closure c )
}
然后您可以在括号外使用闭包定义调用 each():
SomeCollection stuff = new SomeCollection();
stuff.each() { println it }
也可以使用更传统的语法,还要注意,在 Groovy 中,您可以在许多情况下省略括号,因此这两种变体也是合法的:
SomeCollection stuff = new SomeCollection();
stuff.each { println it } // Look ma, no parens
stuff.each ( { println it } ) // Strictly traditional
即使该方法有其他参数,同样的规则也适用。唯一的限制是闭包参数必须是最后一个:
class SomeCollection {
public void inject ( x, Closure c )
}
stuff.inject( 0 ) { count, item -> count + item } // Groovy
stuff.inject( 0, { count, item -> count + item } ) // Traditional
这可能与“Groovy 问题”无关,但例如在 Scala 中,这种“形式”是函数柯里化的特例:
scala> def fun[A, B](a: A)(b: B) = {true}
fun: [A, B](a: A)(b: B)Boolean
scala> fun(1){2}
res59: Boolean = true