快速业务通道

Java语言中的函数编程 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
二元谓词适配为一元

可能注意到的第二件事是我引入了一个名为 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. 使用外部和内部迭代器

 package com.infosys.setl.fp; import java.util.*; import org.apache.commons.functor.Algorithms; import org.apache.commons.functor.UnaryFunction; import org.apache.commons.functor.UnaryProcedure; import org.apache.commons.functor.core.Constant; import org.apache.commons.functor.core.collection.FilteredIterator; import org.apache.commons.functor.core.comparator.IsGreaterThanOrEqual; import org.apache.commons.functor.core.composite.UnaryCompositeBinaryPredicate; public class TestE {   public static void main(String[] args)   {   Vector items = new Vector();   for (int i=0; i<10; i++)   {     SETLItem item = new SETLItem();    if (i%2==0)   item.setPrice(101);    else   item.setPrice(i);    items.add(item);   }   TestE t = new TestE();   System.out.println("The sum calculated using External Iterator is: " +    t.calcPriceExternalIterator(items));   Syst

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号