Scala入門之Array

蘑菇雲代碼

package com.dtspark.scala.basics
/**
 * 大數據技術是數據的集合以及對數據集合的操作技術的統稱,具體來說:
 * 1,數據集合:會涉及數據的蒐集、存儲等,蒐集會有很多技術,存儲現在比較經典的是使用Hadoop,也有很多情況使用Kafka;
 * 2,對數據集合的操作技術:目前全球最火爆的是Spark;
 * 
 * Spark的框架實現語言是Scala,首選的應用程序開發語言也是Scala,所以Scala對集合以及集合操作的支持就至關重要且必須異常強大;
 * 一個補充說明是:可能是巧合,Spark中對很多數據的操作的算子和Scala中對集合的操作算子是一樣一樣的!也就是說你掌握了Scala中
 * 的集合的操作,基本上就可以直接去開發Spark代碼啦,非常美妙!
 * 
 * 關於Scala中數據的創建與操作:
 * 1,最最原始的創建數據的方式是形如val array = new Array[Int](5) ,指定數組的類型是Int且其固定長度是5個元素;
 * 2, 對數組元素訪問的時候下標的範圍在0到length-1的長度,超過length-1的話會出現java.lang.ArrayIndexOutOfBoundsException
 * 3, 最常用和經典的創建數組的方式是形如Array[Int](1,2,3,4,5),直接通過Array類名並傳入參數的方式來創建數組實例,在背後的實現是調用Array的
 *      工廠方法模式apply來構建出數組及數組的內容的;
 * 4, 關於Array本身在底層的實現是藉助了JVM平臺上的Java語言的數組的實現,是不可變的!
 * 5, 如果我們想使用可變數組的話,首先需要導入import scala.collection.mutable.ArrayBuffer,然後使用ArrayBuffer這個可變數組
 * 6, 關於ArrayBuffer增加元素默認情況下都是在ArrayBuffer末尾增加元素的,效率非常高!
 * 7,當需要多線程併發操作的時候,把ArrayBuffer轉換成爲Array就非常重要。其實,即使是Array,其本身雖然不可變動(元素不可刪減),但是我們可以修改Array中每個元素的內容,所以多線程操作的時候
 *      還是必須考慮併發寫的問題;
 * 8,如果想在已經有的數組的基礎上通過作用於每個元素來生成新的元素構成的新數組,則可以通過yield語法來完成,這在大數據中意義重大:
 *      第一點:它是在不修改已經有的Array的內容的基礎上完成的,非常適合於大數據的處理;
 *      第二點:在大數據中處理中,例如Spark中業務操作的核心思想就類似於yield,來通過使用function對每個元素操作獲得新的元素構成的新的集合,其實就是新的RDD,例如MapPartitionsRDD
 * 9, 集合的操作往往可以通過豐富的操作算子,例如filter來過濾需要條件的元素,例如map來進行每一個元素的加工;
 */
object HelloArrayOps {
  def main(args: Array[String]): Unit = {
//    val array = new Array[Int](5)
    val array = Array(1,2,3,4,5)  //在這裏可以去掉[Int]這個泛型類型,是因爲Scala有類型推到的能力,而我們已經傳進了當前數組Array的值,所以可以根據值來推導出類型;
//    val array = Array.apply(1,2,3,4,5)
    array(0) = 10  //數據的索引下標是從0開始的
//    array(5) = 1 //數組下標越界,會出現java.lang.ArrayIndexOutOfBoundsException
    for(item <- array) println(item)


    val names = Array("Scala","Kafka","Spark")
    for(item <- names) println(item)

    import scala.collection.mutable.ArrayBuffer
    val arrayBuffer = ArrayBuffer[Int]()
    arrayBuffer += 1
    arrayBuffer += 2
    arrayBuffer += 3
    arrayBuffer += (4,5,6,7,8,9,10)
    arrayBuffer ++= Array(1,2,3)
    arrayBuffer.insert(arrayBuffer.length - 1, 100,1000)
    arrayBuffer.remove(arrayBuffer.length -2)
    arrayBuffer.toArray //當需要多線程併發操作的時候,把ArrayBuffer轉換成爲Array就非常重要。
    for(item <- arrayBuffer) println(item)

    for(i <- 0 until array.length) print(array(i) + " ")
    println
    for(i <- 0 until (array.length, 2)) print(array(i) + " ")
    println
    for(i <- (0 until array.length).reverse) print(array(i) + " ")
    println
    println("Sum = " + array.sum)
    println("Max = " + array.max)
    scala.util.Sorting.quickSort(array)  //對數組進行升序排序,內容變成了2,3,4,5,10
    println("quickSort = " + array.mkString(","))
    println(array.mkString("*****", ",", "*****"))

    val arrayAddedOne = for(item <- array) yield item + 1
    println(arrayAddedOne.mkString(" "))
    val arrayEven = for(item <- array if item % 2 == 0) yield item
    println(arrayEven.mkString(","))

    println(array.filter { x => x % 2 == 0}.mkString("  "))
    println(array.filter { _ % 2 == 0}.mkString("  "))
    println(array.filter { _ % 2 == 0}.map { _ * 10 }.mkString("  "))
  }
}

以上內容來自[DT大數據夢工廠]首席專家Spark專家王家林老師的課程分享。感謝王老師的分享,更多精彩內容請掃描關注[DT大數據夢工廠]微信公衆號DT_Spark

發佈了45 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章