如果没有参数,您将如何编写collect
方法Closures
?这将比现在复杂得多。Builders, ,inject
等等也是如此...each
with
它允许您定义一些通用的东西,然后在以后使其更具体。例如,该collect
方法可以描述为“获取一个集合或可迭代的,并为每个元素做一些事情并将其添加到新创建的集合中”。如果没有闭包在以后指定此DO SOMETHING,则 的值collect
将是最小的。
慢慢地,你会找到一种更实用的思维方式。与其编写一个特定的函数来执行特定的任务,我是否可以编写一个函数,它采用更多适用于多个问题的通才方法,并将每个单独案例的细节放在一个闭包中?
编辑
作为一个例子,考虑这个过程方法,它返回一个介于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 )
如果我们使用闭包(用于过滤)在 Groovy 中编写此代码,我们会得到:
List<Integer> filter( int min, int max, int mult ) {
(min..max).findAll { it % mult == 0 }
}
println filter( 1, 200, 15 )
(我接受这个例子基本上反映了 的功能findAll
,所以可能不是一个很好的例子——而且也有点做作)
现在考虑我们要根据其他一些条件进行过滤(整数存在于数据库中或其他东西中)......我们可以首先将我们的filter
方法重写为:
List<Integer> filter( int min, int max, Closure<Boolean> filter ) {
(min..max).findAll filter
}
println filter( 1, 200 ) { it % 15 == 0 }
然后,如您所见,我们可以将任何闭包传递给该方法,如果我们想要保留元素,则返回 true,如果想要删除元素,则返回 false。
要以命令式风格执行此操作,您将(可能)最终使用多种方法来完成非常相似的任务......