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

原创
2016/04/10 22:57
阅读数 1.6W

Problem

    如何使用foreach方法来遍历一个集合中的所有元素

Solution

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

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

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:Int

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

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

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

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

scala> x.foreach(println)
1
2
3

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

Discussion

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

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

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

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

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")
}

    

展开阅读全文
打赏
2
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
2
分享
返回顶部
顶部