第十章 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")
}
相關文章
相關標籤/搜索