快速业务通道

面向Java开发人员的Scala指南 - 集合类型 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
递归操作中创建的栈帧的数量,因此需要指定它的返回类型。即使是这样,也可以轻松地使用 List 的 “length” 成员获取列表项的数量,但关键是如何解释列表处理强大的功能。清单 9 中的整个方法完全是线程安全的,因为列表处理中使用的整个中间状态保存在参数的堆栈上。因此,根据定义,它不能被多个线程访问。函数性方法的一个优点就是它实际上与程序功能截然不同,并且仍然创建共享的状态。

列表 API

列表具有另外一些有趣的特性,例如构建列表的替代方法,使用 :: 方法(是的,这是一种方法。只不过名称比较有趣)。因此,不必使用 “List” 构造函数语法构建列表,而是将它们 “拼接” 在一起(在调用 :: 方法时),如清单 10 所示:

清单 10. 是 :: == C++ 吗?

@Test def recurseConsedList =   {    val myVIPList = "Ted" :: "Amanda" :: "Luke" :: "Don" :: "Martin" :: Nil    def count(VIPs : List[String]) : Int =    {     if (VIPs.isEmpty)      0     else      count(VIPs.tail) + 1    }    assertEquals(count(myVIPList), myVIPList.length)   }

在使用 :: 方法时要小心 — 它引入了一些很有趣的规则。它的语法在函数语言中非常常见,因此 Scala 的创建者选择支持这种语法,但是要正确、普遍地使用这种语法,必须使用一种比较古怪的规则:任何以冒号结束的 “名称古怪的方法” 都是右关联(right-associative)的,这表示整个表达式从它的最右边的 Nil 开始,它正好是一个 List。因此,可以将 :: 认定为一个全局的 :: 方法,与 String 的一个成员方法(本例中使用)相对;这又表示您可以对所有内容构建列表。在使用 :: 时,最右边的元素必须是一个列表,否则将得到一个错误消息。

在 Scala 中,列表的一种最强大的用法是与模式匹配结合。由于列表不仅可以匹配类型和值,它还可以同时绑定变量。例如,我可以简化清单 10 的列表代码,方法是使用模式匹配区别一个至少具有一个元素的列表和一个空列表:

清单 11. 结合使用模式匹配和列表

@Test def recurseWithPM =   {    val myVIPList = "Ted" :: "Amanda" :: "Luke" :: "Don" :: "Martin" :: Nil    def count(VIPs : List[String]) : Int =    {     VIPs match     {      case h :: t => count(t) + 1      case Nil => 0     }    }    assertEquals(count(myVIPList), myVIPList.length)   }

面向Java开发人员的Scala指南 - 集合类型(6)

时间:2011-01-30 IBM Ted Neward

在第一个 case 表达式中,将提取列表头部并绑定到变量 h,而其余部分(尾部)则绑定到 t;在本例中,没有对 h 执行任何操作(实际上,更好的方法是指明这个头部永远不会被使用,方法是使用一个通配符 _ 代替 h,这表明它是永远不会使用到的变量的占位符)。但是 t 被递归地传递给 count,和前面的示例一样。还要注意,Scala 中的每一个表达式将隐式返回一个值;在本例中,模式匹配表达式的结果是递归调用 count + 1,当达到列表结尾时,结果为 0。

考虑到相同的代码量,使用模式匹配的价值体现在哪里?实际上,对于比较简单的代码,模式匹配的价值不很明显。但是对于稍微复杂的代码,例如扩展示例以匹配特定值,那么模式匹配非常有帮助。

清单 12. 模式匹配

@Test def recurseWithPMAndSayHi =   {    val myVIPList = "Ted" :: "Amanda" :: "Luke" :: "Don" :: "Martin" :: Nil

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