Java 语言中的函数编程
2009-11-12 00:00:00 来源:WEB开发网BinaryPredicate 接口以由 Apache Functor 库提供的 IsGreaterThanOrEqual 类的形式特化。 PriceComparator 类实现了 java.util.Comparator 接口,并被作为输入传递给 IsGreaterThanOrEqual 类。收到一个 test 消息时, IsGreaterThanOrEqual 类自动调用 PriceComparator 类的 compare 方法。 compare 方法预期接收两个 SETLItem 对象,相应地它返回两个商品的价格差。 compare 方法返回的正值表明 item1 的成本不低于 item2 。
初看之下,对一个相当基本的操作要做很多的工作,那它有什么好处呢?特化 BinaryPredicate 接口(而不是编写 Java 比较表达式) 使您无论在何时何地都可以比较任意两个商品的价格。可以将 bp 对象作为数据传递并向它发送消息,以在任何时候、使用这两个参数的任何值来执行它(称为 test )。
表达式合成
表达式合成是得到同样结果的一种稍有不同的技术。考虑计算特定 SETLItem 的净价问题,要考虑当前折扣和销售税率。清单 3 列出了这个问题基于仿函数的解决方式。
清单 3. 表达式合成方法package com.infosys.setl.fp;
import org.apache.commons.functor.BinaryFunction;
import org.apache.commons.functor.UnaryFunction;
import org.apache.commons.functor.adapter.LeftBoundFunction;
public class Multiply implements BinaryFunction
{
public Object evaluate(Object left, Object right)
{
return new Double(((Double)left).doubleValue() * ((Double)right).doubleValue());
}
}
package com.infosys.setl.fp;
import org.apache.commons.functor.*;
import org.apache.commons.functor.core.composite.*;
import org.apache.commons.functor.adapter.*;
import org.apache.commons.functor.UnaryFunction;
public class TestB
{
public static void main(String[] args)
{
try
{
double discountRate = 0.1;
double taxRate=0.33;
SETLItem item = new SETLItem();
item.setPrice(100);
UnaryFunction calcDiscountedPrice =
new RightBoundFunction(new Multiply(), new Double(1-discountRate));
UnaryFunction calcTax =
new RightBoundFunction(new Multiply(), new Double(1+taxRate));
CompositeUnaryFunction calcNetPrice =
new CompositeUnaryFunction(calcTax, calcDiscountedPrice);
Double netPrice = (Double)calcNetPrice.evaluate(new Double(item.getPrice()));
System.out.println("The net price is: " + netPrice);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
更多精彩
赞助商链接