方法 – 将闭包传递给方法有什么好处吗?
我想知道将闭包对象传递给方法的真正用途是什么.
可以说我有一个关闭: def a = { println it } (考虑它正在进行某种操作而不仅仅是打印) 现在我只是将这个闭包传递给一个方法: def testMethod(def input,Closure a){ a(input) } testMethod "MethodPointer",a //passing closure. 现在问题是为什么这种间接水平?为什么testMethod不能直接处理它的输入?是的,这里我正在输入要在闭包a中处理,但为什么要这样做呢?通过封闭的真正用途是什么? 提前致谢. 解决方法
如何在没有Closures参数的情况下编写collect方法?它会比现在复杂得多.对于Builders,inject,each,with以及更多……
它允许您定义通用的东西,然后在以后使其更具体.例如,collect方法可以描述为“采集集合或可迭代,并为每个元素DO SOMETHING并将其添加到新创建的集合”.如果没有Closures在以后指定此DO SOMETHING,则collect的值将是最小的. 慢慢地,你会发现一种更具功能性的思维方式.我可以编写一个函数,而不是编写一个特定的函数来执行特定的任务,它可以采用更多适用于多个问题的通用方法,并将每个案例的细节放在一个Closure中吗? 编辑 作为一个例子,考虑这个程序方法,它返回min和max之间的数字列表,它是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 ) 如果我们使用Closures(用于过滤)在Groovy中编写它,我们得到: List<Integer> filter( int min,int mult ) { (min..max).findAll { it % mult == 0 } } println filter( 1,15 ) (我接受这个例子基本上反映了findAll的功能,所以可能不是一个很好的例子 – 而且也有点人为) 现在考虑我们想要根据一些其他标准(整数存在于数据库或其他东西中)进行过滤…我们可以先将我们的过滤方法重写为: List<Integer> filter( int min,Closure<Boolean> filter ) { (min..max).findAll filter } println filter( 1,200 ) { it % 15 == 0 } 然后,正如您所看到的,我们可以将任何闭包传递给此方法,如果我们想要保留元素,则返回true;如果我们想要删除它,则返回false. 要以命令式的方式执行此操作,您将(可能)最终使用多种方法执行非常类似的任务… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |