实战 Groovy: 用 curry 过的闭包进行函数式编程
2009-11-19 00:00:00 来源:WEB开发网在这里可以看到名为 map 的闭包,不要把它与 Map 接口混淆。map 闭包有一个参数 f 代表闭包,还有一个参数 list 代表(不要惊讶)List。它返回一个新 List,其中 f 已经映射到 list 中的每个元素。当然,Groovy 已经有了用于 Lists 的 collect() 方法,所以我们在我们的实现中也使用了它。
在清单 7 中,我们把事情又向前进行了一步,对 map 闭包进行了 curry 处理,形成一个块,会将指定列表中的所有元素都乘以 12。
清单 7. 添加一些 curry,并乘以 12import fp.*
def twelveTimes = { x -> return 12 * x }
def twelveTimesAll = Functor.map.curry(twelveTimes)
def table = twelveTimesAll([1, 2, 3, 4])
println "table: ${table}"
// table: [12, 24, 36, 48]
现在,这 就是我们称之为五星计算的东西!
业务规则用 curry 处理
关于闭包的技艺的讨论很不错,但是更关注业务的人会更欣赏下面这个例子。在考虑计算特定 Book 条目净值的问题时,请考虑商店的折扣和政府的税金(例如 增值税)。如果想把这个逻辑作为 Book 类的一部分包含进来,那么形成的解决方案可能是个难缠的方案。因为书店可能会改变折扣,或者折扣只适用于选定的存货,所以这样一个解决方案可能会太刚性了。
但是猜猜情况如何。变化的业务规则非常适合于使用 curry 过的闭包。可以用一组简单的闭包来表示单独的业务规则,然后用复合把它们以不同的方式组合起来。最后,可以用 计算模式 把它们映射到集合。
清单 8 演示了书店的例子。闭包 rMultiply 是个局部应用程序,通过使用一个不变的第二操作数,把二元乘法改变成一元闭包。两个图书闭包 calcDiscountedPrice 和 calcTax 是 rMultiply 闭包的实例,为乘数值设置了值。闭包 calcNetPrice 是计算净价的算法:先计算折扣价格,然后在折扣价格上计算销售税。最后, calcNetPrice 被应用于图书价格。
- ››实战案例分析:高质量软文对网站百度排名的影响
- ››实战经验浅谈网站搬家后的优化工作
- ››实战Active Directory站点部署与管理,Active Dir...
- ››实战操作主机角色转移,Active Directory系列之十...
- ››实战经验:巧用微博推广淘宝网店
- ››实战iPhone GPS定位系统
- ››实战Linux环境配置DBD:Oracle模块
- ››实战DeviceIoControl系列之一:通过API访问设备驱...
- ››实战DeviceIoControl系列之二:获取软盘/硬盘/光盘...
- ››实战DeviceIoControl系列之三:制作磁盘镜像文件
- ››实战DeviceIoControl系列之四:获取硬盘的详细信息...
- ››实战DeviceIoControl之五:列举已安装的存储设备
更多精彩
赞助商链接