第十章 Scala 容器基础(九):使用foreach来遍历一个集合

Problem

    如何使用foreach方法来遍历一个集合中的全部元素
函数

Solution

    方法foreach使用函数做为参数。这个函数的定义应该使用一个集合元素做为输入参数,同时不该该有返回值。而且这个函数的输入参数类型必须是集合中的元素类型。当foreach方法运行的时候,它每次把一个元素从集合中取出做为参数传入到函数中,直到全部的元素都遍历完毕。
scala

    下面咱们来看一个例子,一个通用的用来打印集合信息的例子:code

scala> val x = Vector(1,2,3)
x: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)

scala> x.foreach((i:Int) => println(i))
1
2
3

    这种一种函数定义的普通写法,但其实Scala能够推断出i的类型为Int,因此没有必要写出i:Intit

scala> x.foreach(i => println(i))
1
2
3

    咱们还有一种更为简洁的写法,这种方式用到了_这种通配符来替代一个临时变量i:io

scala> x.foreach(println _)
1
2
3

     在这种状况下,函数字面量包含一个带单个参数的声明,它能够写成更为简洁的形式:table

scala> x.foreach(println)
1
2
3

    对于一个像这样简历的例子,最后这样写法是最经常使用的
class

Discussion

    只要你的函数只有一个参数,这个参数的类型是和集合元素类型一致的,而且函数没有任何返回值,那么你就能够调用foreach方法。接下来的例子中,printit方法接受一个char类型的参数,而后对它执行若干操做,同时没有返回值:变量

scala> def printIt(c:Char){println(c)}
printIt: (c: Char)Unit

scala> "HAL".foreach(printIt)
H
A
L

    若是这个函数你只使用一次,那么就没有必要去声明它,直接使用函数字面量就好了foreach

scala> "HAL".foreach((c:Char) => println(c))
H
A
L

    除了能够用于有序集合外,foreach还能够用于Map类,当使用时函数的入参是一个二元祖(key,value):遍历

scala> val m = Map(1->"a",2->"b",3->"c")
m: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b, 3 -> c)

scala> m.foreach(x => println(x._1 + "->" + x._2))
1->a
2->b
3->c

    一般状况下,使用下面的写法更能表达出程序的含义:

movieRatings.foreach {
    case(movie, rating) => println(s"key: $movie, value: $rating")
}
相关文章
相关标签/搜索