列表間映射:map、flatMap和foreach
1.xs map f 操作返回把函數f應用在xs的每個列表元素之后由此組成的新列表。如:
scala> List(1, 2, 3) map (_ + 1) res0: List[Int] = List(2, 3, 4) scala> val words = List("the", "quick", "brown", "fox") words: List[String] = List(the, quick, brown, fox) scala> words map (_.length) res1: List[Int] = List(3, 5, 5, 3) scala> words map (_.toList.reverse.mkString) res2: List[String] = List(eht, kciuq, nworb, xof)
2.flatMap操作符與map類似,不過它的右操作元是能夠返回元素列表的函數。它對列表的每個元素調用該方法,然后連接所有方法的結果並返回。map與flatMap的差異舉例說明如下:
scala> words map (_.toList) res3: List[List[Char]] = List(List(t, h, e), List(q, u, i, c, k), List(b, r, o, w, n), List(f, o, x)) scala> words flatMap (_.toList) res4: List[Char] = List(t, h, e, q, u, i, c, k, b, r, o, w, n, f, o, x)
List.range是可以創建某范圍內所有整數列表的工具方法。例如:
scala> List.range(1, 5) flatMap (i => List.range(1, i) map (j => (i, j)))
res6: List[(Int, Int)] = List((2,1), (3,1), (3,2), (4,1), (4,2), (4,3))
3.foreach是第三種與映射類似的操作。它的右操作元是過程(返回Unit的函數)。它只是對每個列表元素都調用一遍過程。操作的結果仍然是Unit,不會產生結果列表。例如:
scala> var sum = 0 sum: Int = 0 scala> List(1, 2, 3, 4, 5) foreach (sum += _) scala> sum res9: Int = 15
列表過濾:filter、partition、find、takeWhile、dropWhile和span
1.xs filter p操作產生xs中符合p(x)為true的所有元素組成的列表。如:
scala> List (1, 2, 3, 4, 5) filter (_ % 2 == 0) res10: List[Int] = List(2, 4) scala> words filter (_.length == 3) res11: List[String] = List(the, fox)
2.partition方法與filter類似,不過返回的是列表對。其中一個包含所有論斷為真的元素,另一個包含所有論斷為假的元素。
xs partition p 等價於 (xs filter p, xs filter (!p()))
舉例如下:
scala> List(1, 2, 3, 4, 5) partition (_ % 2 ==0)
res12: (List[Int], List[Int]) = (List(2, 4),List(1, 3, 5))
3.find方法同樣與filter方法類似,不過返回的是第一個滿足給定論斷的元素,而並不是全部。xs find p 操作以列表xs和論斷p為操作元。返回可選值。如果xs中存在元素x使得p(x)為真,Some(x)將返回。否則,若p對所有元素都不成立,None將返回。舉例如下:
scala> List(1, 2, 3, 4, 5) find (_ % 2 == 0) res13: Option[Int] = Some(2) scala> List(1, 2, 3, 4, 5) find (_ <= 0) res15: Option[Int] = None
4. xs takeWhile p操作返回列表xs中最長的能夠滿足p的前綴。例如:
scala> List(1, 2, 3, -4, 5) takeWhile (_ > 0)
res16: List[Int] = List(1, 2, 3)
5.xs dropWhile p操作移除最長能夠滿足p的前綴。舉例如下:
scala> words dropWhile (_ startsWith "t")
res17: List[String] = List(quick, brown, fox)
6.span方法把takeWhile和dropWhile組合成一個操作。它返回一對列表,定義與下列等式一致:
xs span p 等價於 (xs takeWhile p, xs dropWhile p)
scala> List(1, 2, 3, -4, 5) span (_ >0)
res18: (List[Int], List[Int]) = (List(1, 2, 3),List(-4, 5))
列表的論斷:forall和exists
1. xs forall p 如果列表的所有元素滿足p則返回true。
2. xs exists p 如果列表中有一個值滿足p就返回true。
例如,要找出以列表的列表形式表達的矩陣是否有全為零的行:
scala> def hasZeroRow(m: List[List[Int]]) = m exists (row => row forall (_ == 0)) hasZeroRow: (m: List[List[Int]])Boolean scala> val m= List(List(3,0,0), List(0,3,0), List(0,0,3)) m: List[List[Int]] = List(List(3, 0, 0), List(0, 3, 0), List(0, 0, 3)) scala> hasZeroRow(m) res21: Boolean = false
折疊列表:/:和:\
scala> def sum(xs: List[Int]): Int = (0 /: xs) (_ + _)
sum: (xs: List[Int])Int
sum(List(a, b, c)) 等價於 0 + a + b + c
scala> def product(xs: List[Int]): Int = (1 /: xs) (_ * _)
product: (xs: List[Int])Int
product(List(a, b, c)) 等價於 1 * a * b * c
左折疊操作“(z /: xs) (op)” 與三個對象有關:開始值z,列表xs,以及二元操作op。折疊的結果op應用到前綴值z及每個相鄰元素上。
:\操作符被稱為右折疊。與左折疊一樣帶有三個操作元,不過前兩個的出現次序相反:第一個操作元是待折疊的列表,第二個是開始值。(xs \: z) (op)
列表排序:sortWith
對列表xs的操作,xs sortWith before,可以對列表的元素執行排序,其中“before”是比較元素的方法。舉例如下:
scala> List(1, -3, 4, 2, 6) sortWith (_ < _) res2: List[Int] = List(-3, 1, 2, 4, 6)
scala> words sortWith (_.length > _.length)
res5: List[String] = List(quick, brown, the, fox)