Java 语言中的函数编程
2009-11-12 00:00:00 来源:WEB开发网这种将多参数的函数重新编写为一个参数的函数的合成(composition)技术也称为 currying。
合成魔术在最后的时候就发挥作用了。实质上,计算对象净价的算法是首先计算折扣价格(使用 calcDiscountRate 仿函数),然后通过在上面加上销售税(用 calcSalesTax 仿函数)计算净价。就是说,需要组成一个函数,在内部调用第一个仿函数并将计算的输出流作为第二个仿函数的计算的输入。Apache 库提供了用于这种目的的一个内置仿函数,称为 CompositeUnaryFunction 。
在清单 3 中, CompositeUnaryFunction 实例化为变量 calcNetPrice ,作为 calcDiscountRate 和 calcSalesTax 仿函数的合成。与前面一样,将可以向其他函数传递这个对象,其他函数也可以通过向它发送一个包含商品参数的 evaluate 消息要求它计算这种商品的净价。
一元与二元合成
在清单 3 中,您看到了 一元合成的一个例子,其中一个一元仿函数的结果是另一个的输入。另一种合成称为 二元合成,作为 evaluate 消息的一部分,需要传递两个一元仿函数的结果作为二元仿函数的参数。
清单 4 是说明二元合成的必要性和风格的一个例子。假定希望保证商店可以给出的最大折扣有一个最大限度。因此,必须将作为 calcDiscount 仿函数计算结果得到的折扣量与 cap 值进行比较,并取最小值作为计算出的折扣价格。折扣价格是通过用标签价减去实际的折扣而计算的。
清单 4. 二元合成package com.infosys.setl.fp;
import org.apache.commons.functor.BinaryFunction;
public class Subtract 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.BinaryFunction;
import org.apache.commons.functor.UnaryFunction;
public class BinaryFunctionUnaryFunction implements UnaryFunction
{
private BinaryFunction function;
public BinaryFunctionUnaryFunction(BinaryFunction f)
{
function=f;
}
public Object evaluate(Object obj)
{
return function.evaluate(obj,obj);
}
}
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;
import org.apache.commons.functor.core.Constant;
import org.apache.commons.functor.core.comparator.Min;
public class TestC
{
public static void main(String[] args)
{
double discountRate = 0.1;
double taxRate=0.33;
double maxDiscount = 30;
SETLItem item = new SETLItem();
item.setPrice(350);
UnaryFunction calcDiscount =
new RightBoundFunction(new Multiply(), new Double(discountRate));
Constant cap = new Constant(new Double(maxDiscount));
BinaryFunction calcActualDiscount =
new UnaryCompositeBinaryFunction (new Min(), calcDiscount, cap);
BinaryFunctionUnaryFunction calcActualDiscountAsUnary =
new BinaryFunctionUnaryFunction(calcActualDiscount);
BinaryFunction calcDiscountedPrice =
new UnaryCompositeBinaryFunction (new Subtract(), new Identity(), calcActualDiscountAsUnary);
BinaryFunctionUnaryFunction calcDiscountedPriceAsUnary =
new BinaryFunctionUnaryFunction(calcDiscountedPrice);
UnaryFunction calcTax =
new RightBoundFunction(new Multiply(), new Double(1+taxRate));
CompositeUnaryFunction calcNetPrice =
new CompositeUnaryFunction(calcTax, calcDiscountedPriceAsUnary);
Double netPrice = (Double)calcNetPrice.evaluate(new Double(item.getPrice()));
System.out.println("The net price is: " + netPrice);
}
}
更多精彩
赞助商链接