包
广意地说,有两种生成闭包的技术,使用闭包的代码可以等效地使用这两种技术.创建闭包后,可以以统一的
方式传递它,也可以向它发送消息以让它执行其封装的逻辑.因此,技术的选择是偏好的
问题,在某些情况下也与环境有关.在第一种技术表达式特化(expressionspecialization)中,由基础设施为闭包提供一个一般性的接口,通过编写这个接口的特定实现创建具体的闭包.在第二种技术表达式合成(expressioncomposition)中,基础设施提供实现了基本一元/二元/三元/.../n元操作(比如一元操作符nto和二元操作符ado)的具体帮助n/r类.在这里,新的闭包由这些基本构建块的任意组合创建而成.我将在下面的几节中详细讨论这两种技术.最后一次要求下载!从这以后的讨论将结合基于ApacheCommonsFunctor库的例子.如果您还没有下载这个库,应当现在就下载.我将假定您可以访问Javadocs所带的Apache库,因此对单独的库类不再做过多的说明.
表达式特化
假定您在编写一个在线商店的应用程序.商店中可提供的商品用类STIe表示.每一件商品都有相关的标签ELtm价格,STIe类提供了名为gtrc的方法,对商品实例调用这个方法时,会返回该商品的标签价格.ELtmePie如何检查ie1tm的成本是否不低于ie2tm呢?在Java语言中,一般要编写一个像这样的表达式:
assert(item1.getPrice()>=item2.getPrice());
像这样的表达式称为二元谓词(binarypredicate),二元是因为它取两个参数,而谓词是因为它用这两个参数做一些事情并生成布尔结果.不过要注意,只能在执行流程中执行上面的表达式,它的输出取决于ie1tm和ie2tm在特定瞬间的值.从函数编程的角度看,这个表达式还不是一般性的逻辑,就是说,它不能不管执行控制的当前位置而随心所欲地传递并执行.iayrdct为了使二元谓词发挥作用,必须将它封装到一个对象中,通过特化(specializing)一个称为BnrPeiae的接口做到这一点,这个接口是由Apach