将闭包传递给方法有什么好处吗?

Ant*_*t's 3 methods groovy closures

我想知道将闭包对象传递给方法的真正用途是什么.

可以说我有一个关闭:

def a = {
        println it
 }
Run Code Online (Sandbox Code Playgroud)

(考虑它正在进行某种操作而不仅仅是打印)

现在我只是将这个闭包传递a给一个方法:

def testMethod(def input,Closure a){
        a(input)
}

testMethod "MethodPointer", a //passing closure.
Run Code Online (Sandbox Code Playgroud)

现在问题是为什么这种间接水平?为什么不能testMethod直接处理它input?是的,在这里,我正在input关闭处理a,但为什么要这样做呢?通过封闭的真正用途是什么?

提前致谢.

tim*_*tes 7

如果collect没有Closures参数,你会如何编写方法?它会比现在复杂得多.这同样适用于建筑工地,inject,each,with还有更多...

它允许您定义通用的东西,然后在以后使其更具体.例如,该collect方法可以被描述为"采集集合或可迭代,并且对于每个元素DO SOMETHING并将其添加到新创建的集合".如果没有Closures在以后指定此DO SOMETHING,则值collect将是最小的.

慢慢地,你会发现一种更具功能性的思维方式.我可以编写一个函数,而不是编写一个特定的函数来执行特定的任务,而是采用更多适用于多个问题的通用方法,并将每个案例的具体细节放在一个Closure中吗?


编辑

作为一个例子,考虑一个返回之间的数字的名单这个程序方法minmax它们的倍数mult:

List<Integer> filter( int min, int max, int mult ) {
  List<Integer> multiples = new ArrayList<Integer>() ;
  for( int i = min ; i < max ; i++ ) {
    if( i % mult == 0 ) {
      multiples.add( i ) ;
    }
  }
  multiples
}

println filter( 1, 200, 15 )
Run Code Online (Sandbox Code Playgroud)

如果我们使用Closures(用于过滤)在Groovy中编写它,我们得到:

List<Integer> filter( int min, int max, int mult ) {
  (min..max).findAll { it % mult == 0 }
}

println filter( 1, 200, 15 )
Run Code Online (Sandbox Code Playgroud)

(我接受这个例子基本上反映了它的功能findAll,所以可能不是一个很好的例子 - 而且也有点人为)

现在考虑我们想要根据一些其他标准(整数存在于数据库或其他东西中)进行过滤...我们可以先将我们的filter方法重写为:

List<Integer> filter( int min, int max, Closure<Boolean> filter ) {
  (min..max).findAll filter
}

println filter( 1, 200 ) { it % 15 == 0 }
Run Code Online (Sandbox Code Playgroud)

然后,正如您所看到的,我们可以将任何闭包传递给此方法,如果我们想要保留元素,则返回true;如果我们想要删除它,则返回false.

要以命令式的方式执行此操作,您将(可能)最终使用多种方法执行非常类似的任务...


Art*_*ero 5

我们的想法是编写模块化和结构化的清晰代码.

我写了一篇关于Closure Design Patterns的博客文章.您可以使用闭包找到一些模式示例.