第十章 Scala 容器基础(十):使用for循环来遍历一个集合
2016-04-10 00:00
417 查看
摘要: 使用for循环可以非常方便的让你遍历一个集合的元素
如果你的循环体代码很长,那么你同样可以像正常使用for循环一样,执行多行的代码块:
使用一个计数器当作下标来访问一个集合:
你同样可以使用zipWithIndex方法来遍历集合的时候获取当前元素的索引:
生成一个计数器来获取集合元素下标的另一个方法是zip stream:
The for/yield construct
当你想通过一个现有的集合,对其元素进行加工后生成一个新的集合,那么就可以使用for yield这样形式:
再看一下这个例子的另外两种形式,一个是当for循环方法体是多行的时候,另一个形式是当你想复用yield后面的操作函数时:
Map
使用for循环来遍历一个Map同样也是非常方便的:
在使用for循环来遍历一个集合元素的时候,我们同样可以添加if字句来对元素进行过滤:
Problem
我想使用for循环来遍历容器的所有元素,或者通过for yield来创建一个新的集合。Solution
你可以使用for循环遍历所有的Traversable类型(基本上所有的sequency都可以):scala> val fruits = Traversable("apple", "banana", "orange") fruits: Traversable[String] = List(apple, banana, orange) scala> for (f <- fruits) println(f) apple banana orange scala> for (f <- fruits) println(f.toUpperCase) APPLE BANANA ORANGE
如果你的循环体代码很长,那么你同样可以像正常使用for循环一样,执行多行的代码块:
scala> for (f <- fruits) { | val s = f.toUpperCase | println(s) | } APPLE BANANA ORANGE
使用一个计数器当作下标来访问一个集合:
scala> val fruits = IndexedSeq("apple", "banana", "orange") fruits: IndexedSeq[String] = Vector(apple, banana, orange) scala> for (i <- 0 until fruits.size) println(s"element $i is ${fruits(i)}") element 0 is apple element 1 is banana element 2 is orange
你同样可以使用zipWithIndex方法来遍历集合的时候获取当前元素的索引:
scala> for ((elem, count) <- fruits.zipWithIndex) {println(s"element $count is $elem")} element 0 is apple element 1 is banana element 2 is orange
生成一个计数器来获取集合元素下标的另一个方法是zip stream:
scala> for ((elem,count) <- fruits.zip(Stream from 1)) {println(s"element $count is $elem")} element 1 is apple element 2 is banana element 3 is orange scala> for ((elem,count) <- fruits.zip(Stream from 0)) {println(s"element $count is $elem")} element 0 is apple element 1 is banana element 2 is orange
The for/yield construct
当你想通过一个现有的集合,对其元素进行加工后生成一个新的集合,那么就可以使用for yield这样形式:
scala> val fruits = Array("apple", "banana", "orange") fruits: Array[String] = Array(apple, banana, orange) scala> val newArray = for (e <- fruits) yield e.toUpperCase newArray: Array[String] = Array(APPLE, BANANA, ORANGE)
再看一下这个例子的另外两种形式,一个是当for循环方法体是多行的时候,另一个形式是当你想复用yield后面的操作函数时:
scala> val newArray = for (e <- fruits) yield { | val s = e.toUpperCase | s | } newArray: Array[String] = Array(APPLE, BANANA, ORANGE) scala> def upper(s: String):String = {s.toUpperCase} upper: (s: String)String scala> val newArray = for (e <- fruits) yield upper(e) newArray: Array[String] = Array(APPLE, BANANA, ORANGE)
Map
使用for循环来遍历一个Map同样也是非常方便的:
scala> val names = Map("fname" -> "Ed", "lname" -> "Chigliak") names: scala.collection.immutable.Map[String,String] = Map(fname -> Ed, lname -> Chigliak) scala> for ((k,v) <- names) println(s"key: $k, value: $v") key: fname, value: Ed key: lname, value: Chigliak
Discussion
When using a for loop, the <- symbol can be read as “in,” so the following statement can be read as “for i in 1 to 3, do ...”:for (i <- 1 to 3) { // more code here ...
在使用for循环来遍历一个集合元素的时候,我们同样可以添加if字句来对元素进行过滤:
for { file <- files if file.isFile //file是一个文件 if file.getName.endsWith(".txt") //file后缀名为.txt } doSomething(file)
相关文章推荐
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Windows下Scala环境搭建
- 杀毒软件 Dr.Web Anti-virus for Windows Vista 4.44.0 Beta
- C#中循环语句:while、for、foreach的使用
- for 提取文本整行内容的方法
- dos命令for用法详解
- for命令的一些bug分析
- 批处理 FOR参数/F之tokens详解
- Lua中数字for循环实例
- 杀毒软件 Dr.Web Anti-virus for Windows Vista 4.44.0 Beta
- Nero v3.0.0.0 for LINUX 版本 下载
- for语句中的几种分隔符形式小结
- Shell中的for和while循环详细总结
- C#中yield return用法分析
- 非常好的for 教程, 当时我就是看这个学习for 的第1/2页
- Rails Routes中new、collection、member的区别浅析
- mysql Access denied for user ‘root’@’localhost’ (using password: YES)解决方法
- 批处理FOR 中的Delims和Tokens总结
- for 语句从入门到精通
- 最新的 for Vista RTM 驱动程序