Java语言中的函数编程 - 编程入门网
二元谓词适配为一元
可能注意到的第二件事是我引入了一个名为 BinaryPredicateUnaryPredicate 的新仿函数。这个仿函数(类似于在 清单 4 中第一次遇到的 BinaryFunctionUnaryFunction 仿函数)将一个二元谓词接口适配为一元接口。BinaryPredicateUnaryPredicate 仿函数可以认为是一个带有一个参数的一元谓词:它在内部用同一个参数的两个副本计算包装的二元谓词。 isEligibleForDiscount 对象封装了一个完整的业务规则。如您所见,它的构造方式 ── 即,通过将构造块从下到上放到一起以构成更复杂的块,再将它们放到一起以构成更复杂的块,等等 ── 使它本身天然地成为某种“可视化的”规则构造器。最后的规则对象可以是任意复杂的表达式,它可以动态地构造,然后传递以计算底层业务规则。 对集合操作 GoF Iterator 模式提供了不公开其底层表示而访问集合对象的元素的方法。这种方法背后的思路是迭代与数据结构不再相关联(即它不是集合的一部分)。这种方式本身要使用一个表示集合中特定位置的对象,并用一个循环条件(在集合中增加其逻辑位置)以遍历集合中所有元素。循环体中的其他指令可以检查和/或操作集合中当前 Iterator 对象位置上的元素。在本例中,我们对迭代没有什么控制。(例如,必须调用多少次 next 、每次试图访问 next 元素时必须首先检查超出范围错误。) 此外,迭代器必须使用与别人一样的公共接口访问底层数据结构的“成员”,这使得访问效率不高。这种迭代器常被称为 “外部迭代器(External Iterator)”。 FP 对这个问题采取了一种非常不同的方式。集合类有一个高阶函数,后者以一个仿函数作为参数并在内部对集合的每一个成员应用它。在本例中,因为迭代器共享了数据结构的实现,所以您可以完成控制迭代。此外,迭代很快,因为它可以直接访问数据结构成员。这种迭代器常被称为 内部迭代器(internal Iterator)。 Apache Functor 库提供了各种非严格地基于 C++ 标准模板库实现的内部 Iterator 。它提供了一个名为 Algorithms 的 实用工具类,这个类有一个名为 foreach 的方法。foreach 方法以一个 Iterator 对象和一个一元 Procedure 作为输入,并对遍历 Iterator 时遇到的每一个元素(元素本身是作为过程的一个参数传递的)运行一次。 使用内部迭代器 一个简单的例子将可以说明外部和内部 Iterator 的不同。假定提供了一组 SETLItem 对象并要求累积列表中成本高于 200 美元的那些商品的定价。清单 6 展现了完成这一工作的代码。 清单 6. 使用外部和内部迭代器
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |