curry 的基本思想是一个多个参数的函数,传递较少的参数给函数来固定一些值,一个典型的例子是选择一些数 n 并且传递给函数与后面传递的单个参数进行相加,在 groovy 中,Closure 的 curry 方法返回当前闭包的一个克隆品,这个克隆品已经绑定了一个或者多个给定的参数,参数的绑定是从左向右进行的,列表 5.7 给出了一个实现。
我们重用了同一个闭包,在调用 curry 方法的时候创建了一个新的闭包,这个闭包实际上像一个简单的加法器,但是第一个参数已经被固定为 1,最后,我们检查我们的结果。
如果你是闭包或者 curry 的新手,现在是暂停的好时机——重新回到开始 curry 的讨论的地方,再读一遍,这是一个迷惑的概念,慢慢的掌握它,你会感觉到 curry 是一个好东西的。
Curry 最强大的地方是当闭包的参数是闭包本身的时候,这通常在函数式编程时使用到。
假设你需要实现一个日志记录器,它应该支持行数的过滤,日志的格式化,并且输出它们到一个设备上,每一个记录器都应该是可配置的,办法是提供一个闭包作为每一个记录器 自定义版本,这仍旧允许你实现应用一个过滤器,格式化和最终的日志输出,下列的代码显示了 curry 怎样被用来注入到自定义的记录器中:
闭包(1)和(2)像是一个食谱:给出任何过滤器、输出格式和目标,一个行数据将可能被记录到日志中,它们执行这个工作:适当的委派,在(3)的闭包是食谱中的配料,它们每次都每使用,但是我们总是使用同一种配料,curry(在(4))允许仅仅记录一个对象,而不是单独的每一个对象。继续类推,我们放所有的配料在一起,结果就是我们需要记录的日志内容。
日志经常作为一个无趣的主题被忽略,但实际上,在前面代码中的一些日志证明这个想 法是错误的,作为一名严谨的工程师,你明白日志语句经常使用,并且任何日志组件必须注意性能问题。在这一方面,当没有日志被记录的时候,应该不影响性能。
在这个例子中耗时的操作是格式化和打印,过滤是很快的。借助闭包,我们醉心于代码的模式以保证昂贵的操作不被调用(就是不需要打印的日志),configurator 和 appender 闭包实现了这个模式。
这个模式是极其灵活的,因为怎样过滤的逻辑,怎样应用格式化和这样输出结果都是可配置的(甚至在运行时)。
利用闭包和闭包的 curry 方法,我们完美的解决了最佳的相关性和最低的耦合性的问题。
注意每一个闭包实际上都是独立的。
这是函数式编程的开始,在 http://www -128.ibm.com/developerw orks/library/j-pg08235/
(译者注:中文版网址:http://www .ibm.com/developerw orks/cn/java/j-pg08235/)上面可以了解到使用 groovy 的闭包进行函数式编程的相关文章,这篇文章进一步阐述了如何使用这种方式来实现自己的表达式语言,找准业务规则和检查你的代码。