scala編程第16章學習筆記(3)——List類的高階方法


列表間映射: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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM