33.List的一階函數操作代碼實戰詳解

一、List的drop、take、splitAt、apply、indices、toString、mkString等實戰

把兩個List組拼起來,列表和列表連接用三個冒號的連接操作符,元素和列表連接用兩個冒號的連接操作符

    println(List(1,2,3,4) ::: List(5,6,7) ::: List(8,9))
    println(List(1,2,3,4) ::: (List(5,6,7) ::: List(8,9)))
    println(List(1,2,3,4).length)
輸出:

List(1, 2, 3, 4, 5, 6, 7, 8, 9)
List(1, 2, 3, 4, 5, 6, 7, 8, 9)
4


List的相關操作方法:

    val bigdata = List(0,1,2)
    println(bigdata.last)  //List最後一個元素
    println(bigdata.init)   //List中除去最後一個元素,其餘元素的集合
    println(bigdata.reverse) //把List元素反轉過來
    println(bigdata take 2)  //取List前2個元素
    println(bigdata drop 2)  //丟掉List前2個元素
    println(bigdata splitAt 2) // 把List分成兩部分,前面一個部分有2個元素
    println(bigdata.apply(2)) //取下標爲2的元素
    println(bigdata(2))  //同上,取下標爲2的元素

輸出:

2
List(0, 1)
List(2, 1, 0)
List(0, 1)
List(2)
(List(0, 1),List(2))
2
2

List的相關操作方法:

    val data = List('a','b','c','d','e','f')
    println(data indices)  //取出List所有元素相對應的索引
    println(data.indices zip data)  //把左右兩個集合進行拉鍊操作
    println(data zipWithIndex)   //把元素和索引具體進行配對的簡便方法
    println(data.toString())  
   println(data mkString("[",",","]"))  //把List元素按照新的方式進行格式化輸出  
    //第一個參數是格式化輸出的開始第一個元素,第二個參數是集合中每2個元素之間的元素,第三個參數是格式化輸出的最後一個元素
  
   println(data.mkString("*"))   //格式化輸出,只關心中間的元素
    println(data mkString)

輸出:

Range(0, 1, 2, 3, 4, 5)
Vector((0,a), (1,b), (2,c), (3,d), (4,e), (5,f))
List((a,0), (b,1), (c,2), (d,3), (e,4), (f,5))
List(a, b, c, d, e, f)
[a,b,c,d,e,f]
a*b*c*d*e*f
abcdef


List本身不變,要想作改變元素的操作,都會產生新的List,可以把對List改變的操作放在StringBuilder裏

    val builder = new StringBuilder  //相當於緩衝數組
    data.addString(builder,"[", ",", "]")  //把data操作後的結果存入對象
    println(builder)
    println(data)

輸出:

[a,b,c,d,e,f]
List(a, b, c, d, e, f)

Array和List可以相互轉換:

    val array = data.toArray
    println(array.toList)
輸出:List(a, b, c, d, e, f)

把List內容拷貝進一個數組中

    val new_Array = new Array[Char](10)  //注意要拷貝進的這個數組必須能放下List的所有元素
    data.copyToArray(new_Array, 3)  //跳過數組前3個元素
    new_Array.foreach(print)
輸出:

   abcdef


迭代器:

    val iterator = data.toIterator
    println(iterator.next)
    println(iterator.next)
輸出:

a
b

Spark之所以非常強大,讓各個不同的框架(圖計算、機器學習、流處理SQL)可以互相操作,主要因爲有Iterator接口。

eg:機器學習可以直接使用Spark SQL中的內容,其中非常重要的是Spark SQL會產生RDD,要讀取RDD的數據,有Iterator接口,不斷next、next.......因爲接口統一,讀取數據的方式統一,機器學習不用關心數據來自Spark SQL還是流處理。



參考資料來源於大數據夢工廠 深入淺出scala 第33講 由王家林老師講解


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章