快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
使用 Apache Commons Functor 库才能演示这里的例子。

Java语言中的函数编程(2)

时间:2011-01-31 IBM Abhijit Belapurkar

引用透明性

函数程序通常还加强 引用透明性,即如果提供同样的输入,那么函数总是返回同样的结果。就是说,表达式的值不依赖于可以改变值的全局状态。这使您可以从形式上推断程序行为,因为表达式的意义只取决于其子表达式而不是计算顺序或者其他表达式的副作用。这有助于验证正确性、简化算法,甚至有助于找出优化它的方法。

副作用

副作用是修改系统状态的语言结构。因为 FP 语言不包含任何赋值语句,变量值一旦被指派就永远不会改变。而且,调用函数只会计算出结果 ── 不会出现其他效果。因此,FP 语言没有副作用。

这些基本描述应足以让您完成本文中的函数编程例子。

Java 语言中的函数编程

不管是否相信,在 Java 开发实践中您可能已经遇到过闭包和高阶函数,尽管当时您可能没有意识到。例如,许多 Java 开发人员在匿名内部类中封闭 Java 代码的一个词汇单元(lexical unit)时第一次遇到了 闭包。这个封闭的 Java 代码单元在需要时由一个 高阶函数 执行。例如,清单 1 中的代码在一个类型为 java.lang.Runnable 的对象中封闭了一个方法调用。

清单 1. 隐藏的闭包

Runnable worker = new Runnable() {   public void run()   {    parseData();   }   };

方法 parseData 确实 封闭(因而有了名字 “闭包”)在 Runnable 对象的实例 worker 中。它可以像数据一样在方法之间传递,并可以在任何时间通过发送消息(称为 run ) 给 worker 对象而执行。

更多的例子

另一个在面向对象世界中使用闭包和高阶函数的例子是 Visitor 模式。基本上,Visitor 模式展现一个称为 Visitor 的参与者,该参与者的实例由一个复合对象(或者数据结构)接收,并应用到这个数据结构的每一个构成节点。Visitor 对象实质上 封闭 了处理节点/元素的逻辑,使用数据结构的 accept (visitor) 方法作为应用逻辑的高阶函数。

通过使用适当不同的 Visitor 对象(即闭包),可以对数据结构的元素应用完全不同的处理逻辑。与此类似,可以向不同的高阶函数传递同样的闭包,以用另一种方法处理数据结构(例如,这个新的高阶函数可以实现不同逻辑,用于遍历所有构成元素)。

类 java.utils.Collections 提供了另一个例子,这个类在版本 1.2 以后成为了 Java 2 SDK 的一部分。它提供的一种实用程序方法是对在 java.util.List 中包含的元素排序。不过,它使调用者可以将排序列表元素的逻辑封装到一个类型为 java.util.Comparator 的对象中,其中 Comparator 对象作为第二个参数传递给排序方法。

在内部, sort 方法的引用实现基于 合并-排序(merge-sort) 算法。它通过对顺序中相邻的对象调用 Comparator 对象的 compare 方法遍历列表(list)中的元素。在这种情况下, Comparator 是闭包,而 Collections.sort 方法是高阶函数。这种方式的好处是明显的:可以根据在列表中包含的不同对象类型传递不同的 Comparator 对象(因为如何比较列表中任意两个对象的逻辑安全地封装在 Comparator 对象中)。与此类似, sort 方法的另一种实现可以使用完全不同的算法(比如说, 快速排序(quick-sort)) 并仍然重复使用同样的 Comparator 对象,将它作为基本函数应用到列表中两个元素的某种组合。

创建闭包

广意地说,有两种生成闭包的技术,使用闭包的代码可以等效地使用这两种技术。创建闭包后,可以以统一的方式传递它,也可以向它发送消息以让它执行其封装的逻辑。因此,技术的选择是偏好的问题,在某些情况下也与环境有关。

在第一种技术 表达式特化(expression specialization)中,由基础设施为闭包提

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号