快速业务通道

面向Java开发人员的Scala指南 - Scala控制结构内部揭密 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
函数)作为参数并根据需要使用它们即可。

"for" 生成语言

所有这些都引导我们来到了 Scala 控制结构套件的实际动力源泉:for 结构。该结构看起来像是 Java 的增强 for 循环的简单早期版,但它远比一般的 Java 编程人员开始设想的更强大。

让我们来看一下 Scala 如何处理集合上的简单顺序迭代,根据您的 Java 编程经验,我想您应该非常清楚该怎么做:

清单 10. 对一个对象使用 for 循环和对所有对象使用 for 循环

// This is Scala object Application {   def main(args : Array[String])   {    for (i <- 1 to 10) // the left-arrow means "assignment" in Scala     System.out.println("Counting " + i)   } }

此代码所做的正如您期望的那样,循环 10 次,并且每次都输出一些值。需要小心的是:表达式 “1 to 10” 并不意味着 Scala 内置了整数感知(awareness of integer)以及从 1 到 10 的计数方式。从技术上说,这里存在一些更微妙的地方:编译器使用 Int 类型上定义的方法 to 生成一个 Range 对象(Scala 中的任何东西都是对象,还记得吗?),该对象包含要迭代的元素。如果用 Scala 编译器可以看见的方式重新编写上述代码,那么该代码看起来很可能如下所示:

清单 11. 编译器看见的内容

// This is Scala object Application {   def main(args : Array[String])   {    for (i <- 1.to(10)) // the left-arrow means "assignment" in Scala     System.out.println("Counting " + i)   } }

实际上,Scala 的 for 并不了解那些成员,并且并不比其他任何对象类型做得更好。它所了解的是 scala.Iterable,scala.Iterable 定义了在集合上进行迭代的基本行为。提供 Iterable 功能(从技术上说,它是 Scala 中的一个特征,但现在将它视为一个接口)的任何东西都可以用作 for 表达式的核心。List、Array,甚至是您自己的自定义类型,都可以在 for 中使用。

面向Java开发人员的Scala指南 - Scala控制结构内部揭密(6)

时间:2011-01-30 Ted Neward

特殊性

正如上面已经证明的那样,for 循环可以做许多事情,并不只是遍历可迭代的项列表。事实上,可以使用一个 for 循环在操作过程中过滤许多项,并在每个阶段都产生一个新列表:

清单 12. 看一看还有哪些优点

// This is Scala object Application {   def main(args : Array[String])   {    for (i <- 1 to 10; i % 2 == 0)     System.out.println("Counting " + i)   } }

注意到清单 12 中 for 表达式的第二个子句了吗?它是一个过滤器,实际上,只有那些传递给过滤器(即计算 true)的元素 “向前传给” 了循环主体。在这里,只输出了 1 到 10 的偶数数字。

并不要求 for 表达式的各个阶段都成为过滤器。您甚至可以将一些完全平淡无奇的东西(从循环本身的观点来看)放入管道中。例如以下代码显示了在下一个阶段进行计算之前的 i 的当前值:

清单 13. 让我如何爱上您呢?别那么冗长

// This is Scala object App {   def log(item : _) : Boolean =   {    System.out.println("Evaluating " + item)    true   }   def main(args : Array[String]) =   {    for (val i <- 1 to 10; log(i); (i % 2) == 0)     System.out.println("Counting " + i)   } }

在运行的时候,范围 1 到 10 中的每个项都将发送给 log,它将通过显式计算每个项是否为 true 来 “批准” 每个项。然后,for 的第三个子句将对这些项进行筛选,过滤出那些满足是偶数的条件的元素。因此,只将偶数传递给了循环

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