什么是封闭以及为什么要使用它?

时间:2015-09-03 06:16:11

标签: groovy

groovy的封闭是什么?

为什么我们使用这个闭包?

3 个答案:

答案 0 :(得分:0)

您是否在询问Closure注释参数?

[... Groovy中注释的一个有趣特性是您可以使用闭包作为注释值。因此,注释可以与各种表达式一起使用,并且仍然具有IDE支持。例如,想象一下您希望基于JDK版本或OS等环境约束执行某些方法的框架。可以编写以下代码:

class Tasks {
    Set result = []
    void alwaysExecuted() {
        result << 1
    }
    @OnlyIf({ jdk>=6 })
    void supportedOnlyInJDK6() {
        result << 'JDK 6'
    }
    @OnlyIf({ jdk>=7 && windows })
    void requiresJDK7AndWindows() {
        result << 'JDK 7 Windows'
    }
}

...] 来源:http://docs.groovy-lang.org/

答案 1 :(得分:0)

闭包是一个强大的概念,您可以使用它来实现各种功能,并且可以指定DSL。它们有点像Java(lambdas,但更强大,更通用。你不需要来使用闭包,但它们可以让很多事情变得更容易。 既然你没有真正指定一个具体的问题,我只会指出你在groovy文档中的startegy模式示例: http://docs.groovy-lang.org/latest/html/documentation/#_strategy_pattern

答案 2 :(得分:0)

将闭包视为一个可执行单元,就像一个方法或函数,除了你可以像变量一样传递它,但是可以做很多你通常用类做的事情,例如

一个例子:你有一个数字列表,你想要为每个数字添加+1,或者你想要加倍每个数字,所以你说

 def nums = [1,2,3,4,5]

 def plusone = { item ->
    item + 1
 }  

 def doubler = { item ->
    item * 2
 }

 println nums.collect(plusone)
 println nums.collect(doubler)

这将打印出来

[2, 3, 4, 5, 6]
[2, 4, 6, 8, 10]

所以你所取得的成就是你将这个功能与你做的对象分开了“做什么”。你的闭包将一个可以传递并被其他方法使用的动作分开,这些动作与闭包的输入和输出兼容。

我们在示例中所做的是我们有一个数字列表,我们将它们中的每一个传递给一个用它做的事情的闭包。添加+1或将值加倍,并将它们收集到另一个列表中。

这种逻辑为解决问题提供了更多可能性,可以更智能,更清晰,更好地编写能够更好地代表问题的代码。