WEB开发网
开发学院软件开发Java 实战 Groovy: 用 curry 过的闭包进行函数式编程 阅读

实战 Groovy: 用 curry 过的闭包进行函数式编程

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 清单 4. 闭包和集合defages=[20,30,40]defaccounts=['ABC123':200,'DEF456':300,'GHI789':400]defages1=ages.collect({element->returnel


清单 4. 闭包和集合
def ages = [20, 30, 40] 
def accounts = ['ABC123' : 200, 'DEF456' : 300, 'GHI789' : 400] 
def ages1 = ages.collect({ element -> return element + 1 }) 
def accounts1 = accounts.collect 
 { entry -> entry.value += 10; return entry } 
println "ages1: ${ages1}" 
// ages1: [21, 31, 41] 
println "accounts1: ${accounts1}" 
// accounts1: [ABC123=210, GHI789=410, DEF456=310] 
def ages2 = ages.collect { element -> return dec(element) } 
println "ages2: ${ages2}" 
 // ages2: [19, 29, 39] 

最后一个例子搜集名为 ages 的 List 中的所有元素,并将 dec 闭包 (来自清单 3)应用于这些元素。

闭包复合

闭包更重要的一个特征可能就是复合(composition),在复合中可以定义一个闭包,它的目的是组合其他闭包。使用复合,两个或多个简单的闭包可以组合起来构成一个更复杂的闭包。

清单 5 介绍了一个漂亮的 composition 闭包。现在请注意仔细阅读:参数 f 和 g 代表 单个参数闭包。到现在还不错?现在,对于某些参数值 x,闭包 g 被应用于 x,而闭包 f 被应用于生成的结果!哦,只对前两个闭包参数进行了 curry 处理,就有效地形成了一个组合了这两个闭包的效果的新闭包。

清单 5 组合了闭包 triple 和 quadruple,形成闭包 twelveTimes。当把这个闭包应用于实际参数 3 时,返回值是 36。


清单 5. 超级闭包复合
def multiply = { x, y -> return x * y }   
// closure 
def triple = multiply.curry(3)       
// triple = { y -> return 3 * y } 
def quadruple = multiply.curry(4) 
// quadruple = { y -> return 4 * y } 
def composition = { f, g, x -> return f(g(x)) } 
def twelveTimes = composition.curry(triple, quadruple) 
def threeDozen = twelveTimes(3) 
println "threeDozen: ${threeDozen}"  
// threeDozen: 36 

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:实战 Groovy curry

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接