Java语言中的函数编程 - 编程入门网
。即,在一个参数中收到相应的消息( evaluate ) 时,它在内部用两个参数发送一个 evaluate 消息给正在适配的 BinaryFunction ── 左边的是发送给它的参数,右边的是它知道的常量。您一定会猜到,名字 RightBoundFunction 来自于常量值是作为第二个 (右边) 参数传递这一事实。(是的,Apache 库还提供了一个 LeftBoundFunction ,其中常量是作为第一个参数或者左参数传递的。)
用于双精度相乘的特化的 BinaryFunction 清单 3 显示了名为 Multiply 的特化的 BinaryFunction ,它取两个 Double 作为输入并返回一个新的、由前两个双精度值相乘而得到 Double 。 在 calcDiscountedRate 中实例化了一个新的 RightBoundFunction ,它通过用 (1 - discountRate) 作为其常量第二参数,将二元 Multiply 函数适配为一元接口。 结果,可以用一个 Double 参数向 calcDiscountRate 发送一个名为 evaluate 的消息。在内部,输入参数 Double 乘以 calcDiscountRate 对象本身包含的常量值。 与此类似,在 calcTaxRate 中实例化了一个新的 RightBoundFunction ,它通过用 (1 + taxRate) 作为其第二个常量参数将二元 Multiply 函数适配为一元接口。结果,可以用一个 Double 参数向 calcTaxRate 发送一个名为 evaluate 的消息。在内部,输入参数 Double 乘以 calcTaxRate 对象本身包含的常量值。 这种将多参数的函数重新编写为一个参数的函数的合成(composition)技术也称为 currying。 合成魔术在最后的时候就发挥作用了。实质上,计算对象净价的算法是首先计算折扣价格(使用 calcDiscountRate 仿函数),然后通过在上面加上销售税(用 calcSalesTax 仿函数)计算净价。就是说,需要组成一个函数,在内部调用第一个仿函数并将计算的输出流作为第二个仿函数的计算的输入。Apache 库提供了用于这种目的的一个内置仿函数,称为 CompositeUnaryFunction 。 在清单 3 中, CompositeUnaryFunction 实例化为变量 calcNetPrice ,作为 calcDiscountRate 和 calcSalesTax 仿函数的合成。与前面一样,将可以向其他函数传递这个对象,其他函数也可以通过向它发送一个包含商品参数的 evaluate 消息要求它计算这种商品的净价。 一元与二元合成 在清单 3 中,您看到了 一元合成的一个例子,其中一个一元仿函数的结果是另一个的输入。另一种合成称为 二元合成,作为 evaluate 消息的一部分,需要传递两个一元仿函数的结果作为二元仿函数的参数。 清单 4 是说明二元合成的必要性和风格的一个例子。假定希望保证商店可以给出的最大折扣有一个最大限度。因此,必须将作为 calcDiscount 仿函数计算结果得到的折扣量与 cap 值进行比较,并取最小值作为计算出的折扣价格。折扣价格是通过用标签价减去实际的折扣而计算的。 清单 4. 二元合成
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |