快速业务通道

面向Java开发人员的Scala指南 - 面向对象的函数编程 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
ad.sleep(seconds * 1000)    }   }   def main(args: Array[String]): unit =   {    periodicCall(1, () =>     Console.println("Time flies... oh, you get the idea."))   } }

面向Java开发人员的Scala指南 - 面向对象的函数编程(5)

时间:2011-01-30 IBM Ted Neward

这是函数语言中的公共主题:创建一个只做一件事情的高级抽象函数,让它接受一个代码块(匿名函数)作为参数,并从这个高级函数中调用这个代码块。例如,遍历一个对象集合。无需在 for 循环内部使用传统的 Java 迭代器对象,而是使用一个函数库在集合类上定义一个函数 — 通常叫做 “iter” 或 “map” — 接受一个带单个参数(要迭代的对象)的函数。例如,上述的 Array 类具有一个函数 filter,此函数在清单 7 中定义:

清单 7. Array.scala 的部分清单

class Array[A] {    // ...     def filter (p : (A) => Boolean) : Array[A] = ... // not shown }

清单 7 声明 p 是一个接受由 A 指定的泛型参数的函数,然后返回一个布尔值。Scala 文档表明 filter “返回一个由满足谓词 p 的数组的所有元素组成的数组”。这意味着如果我想返回我的 Hello World 程序,查找所有以字母 G 开头的命令行参数,则可以编写像清单 8 一样简单的代码:

清单 8. Hello, G-men!

object HelloWorld {   def main(args: Array[String]): unit = {    args.filter( (arg:String) => arg.startsWith("G") )      .foreach( (arg:String) => Console.println("Found " + arg) )   } }

此处,filter 接受谓词,这是一个隐式返回布尔值(startsWith() 调用的结果)的匿名函数,并使用 args 中的每个元素来调用谓词。如果谓词返回 true,则它将此值添加到结果数组中。遍历了整个数组之后,它接受结果数组并将其返回,然后此数组立即用作 “foreach” 调用的来源,此调用执行的操作就像它名字的含义一样:foreach 接受另一个函数,并将此函数应用于数组中的每个元素(在本例中,仅显示每个元素)。

不难想象等同于上述 HelloG.scala 的 Java 是什么样的,而且也不难发现 Scala 版本非常简短,也非常清晰。

结束语

Scala 中的编程如此地熟悉,同时又如此地不同。相似之处在于您可以使用已经了解而且钟爱多年的相同的核心 Java 对象,但明显不同的是考虑将程序分解成部分的方式。在面向 Java 开发人员的 Scala 指南 的第一篇文章中,我仅仅简单介绍了 Scala 的功能。将来还有很多内容尚待挖掘,但是现在让我们陶醉在函数化的过程中吧!

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