面向Java开发人员的Scala指南 - 面向对象的函数编程 - 编程入门网
ava 社区最近一直热烈争论的话题。在 Scala 中,这很容易完成。考虑清单 3 中的程序,此程序定义了一个函数,该函数每隔一秒调用一次另一个函数:
清单 3. Timer1.scala
不幸的是,这个特殊的代码并没有什么功能 …… 或者甚至没任何用处。例如,如果想要更改显示的消息,则必须修改 oncePerSecond 方法的主体。传统的 Java 程序员将通过为 oncePerSecond 定义 String 参数来包含要显示的消息。但甚至这样也是极端受限的:其他任何周期任务(比如 ping 远程服务器)将需要各自版本的 oncePerSecond,这很明显违反了 “不要重复自己” 的规则。我认为我可以做得更好。 清单 4. Timer2.scala
面向Java开发人员的Scala指南 - 面向对象的函数编程(4)时间:2011-01-30 IBM Ted Neward现在,事情开始变得有趣了。在清单 4 中,函数 oncePerSecond 接受一个参数,但其类型很陌生。形式上,名为 callback 的参数接受一个函数作为参数。只要传入的函数不接受任何参数(以 () 指示)且无返回(由 => 指示)值(由函数值 unit 指示),就可以使用此函数。然后请注意,在循环体中,我使用 callback 来调用传递的参数函数对象。 幸运的是,我在程序的其他地方已经有了这样一个函数,名为 timeFlies。所以,我从 main 中将其传递给 oncePerSecond 函数。(您还会注意到,timeFlies 使用了一个 Scala 引入的类 Console,它的用途与 System.out 或新的 java.io.Console 类相同。这纯粹是一个审美问题;System.out 或 Console 都可以在这里使用。) 匿名函数,您的函数是什么? 现在,这个 timeFlies 函数似乎有点浪费 — 毕竟,它除了传递给 oncePerSecond 函数外毫无用处。所以,我根本不会正式定义它,如清单 5 所示: 清单 5. Timer3.scala
在清单 5 中,主函数将一块任意代码作为参数传递给 oncePerSecond,看起来像来自 Lisp 或 Scheme 的 lambda 表达式,事实上,这是另一种闭包。这个匿名函数 再次展示了将函数当作一级公民处理的强大功能,它允许您在继承性以外对代码进行全新地泛化。(Strategy 模式的粉丝们可能已经开始唾沫横飞了。) 事实上,oncePerSecond 仍然太特殊了:它具有不切实际的限制,即回调将在每秒被调用。我可以通过接受第二个参数指明调用传递的函数的频率,来将其泛化,如清单 6 所示: 清单 6. Timer4.scala
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |