Scala 官網:http://www.scala-lang.org/
一、數據類型
二、變量
/* * 變量的定義 * 語法: * 關鍵字(val / var) 變量名:數據類型(首字母大寫):值 * 特點: * ⑴Scala是強類型語言,必須定義類型; * ⑵Scala中沒有基本數據類型和包裝類之分,所有的數據類型都是類,類型首字母需要大寫; * ⑶聲明變量時可以不指定變量類型,Scala會幫我們進行變量類型推斷; * ⑷當val修飾的變量被lazy修飾時,則該變量的初始化將被推遲,直到第一次使用時纔會去初始化, * 如:lazy val a = 11.2 */ //使用val聲明一個不可變變量 val a:Int = 1 //再次賦值a=2 報錯:error:reassignment to val //使用var聲明一個可變變量 var b = 2 //聲明一個空值的變量 var name:String = "" //賦值一個空串 var name1:String = _ //使用佔位符'_'
三、函數
1、函數定義的語法
def 函數名稱 (參數名稱:參數類型) :函數返回值類型 = {
函數體內容
}
/* * Scala函數的定義 * 語法: * def 函數名稱(參數名稱:參數類型):函數返回值類型 = { 函數體內容 } * 特點: * ⑴Scala可以自動推斷數據類型,所以函數的返回值類型一般可以省略; * ⑵Scala中函數的默認返回值爲Unit; * ⑶Scala中函數爲空參時,可以直接使用函數名調用,小括號可以省略; */ //函數的定義 def fun1(x:Int, y:Int) : Int = { x+y } fun1(1,2) //定義返回值缺省的函數 def fun2(x:Int, y:Int) = { x+y } fun2(2,3) //定義空參函數 def fun3() = { println("hello world!")} fun3() fun3 //函數中定義另一個函數,內函數可以調用外函數的變量 def fun4(a:Int) = { def fun5(b:Int) = { println("a+b=" + (a+b)) } fun5(500) } fun4(20)
2、匿名函數的定義
/* * 匿名函數的定義 * 語法: * (變量1:數據類型,...變量2:數據類型)=> { 函數體內容 } * 特點: * ⑴匿名函數可以賦值給一個函數; * ⑵匿名函數可以賦值給一個變量; */ //匿名函數賦值給一個函數 def add1 = (x:Int, y:Int) => { x+y } add1(1,2) //匿名函數賦值給一個變量 val add2 = (x:Int, y:Int) => { x+y } add2(1,2) //將一個非匿名函數賦值給一個變量 def add3(x:Int, y:Int) = { x+y } val add4 = add3 _ //函數名+空格+佔位符 add4(1,2) /* * 指定參數默認值的函數定義 */ def loadConf(conf:String="spark-default.xml") = { println("conf is " + conf) } loadConf() loadConf("file.xml")
3、變長參數的函數定義
/* * 變長參數的函數定義 * Scala在定義函數時允許指定最後一個參數可以重複(變長參數), * 從而允許函數調用者使用變長參數列表來調用該函數; * Scala中使用"*"來致命該參數爲重複參數; * * 在函數內部,變長參數的類型,實際爲一維數組,比如上例的String*類型實際爲Array[String]。 * 然而,如果你試圖直接傳入一個數組類型的參數給這個參數,編譯器會報錯,如 * val arr = Array("Hadoop","Hive","Hbase","Spark") * printCourses(arr) * 爲了避免這種情況,我們可以通過在變量後面添加"_*"來解決, * 這個符號告訴Scala編譯器在傳遞參數時逐個傳入數組的每個元素,而不是數組整體。 * printCourses(arr: _*) */ def printCourses(c:String*) = { c.foreach(x => println(x)) } printCourses("Hadoop","Hive","Hbase","Spark") val arr = Array("Hadoop","Hive","Hbase","Spark") printCourses(arr: _*)
1、循環表達式
/* * Range是左閉右開區間:[) * until是左閉右開區間:[) * to是左閉右閉區間:[] */ 1 to 5 1.to(5) 1 to(5) 1 until 5 1.until(5) 1 until(5) Range(1,5) Range(1,5,2) //可以指定步長 //Range(1,5,0) 步長不能爲0,報錯 Range(1,-5,-2) Range(5,1,-1)
2、for循環
/* * for循環; * "<-"是一個提取符,可以從集合中遍歷提取出所有元素; */ for (i <- 1 to 5) { println(i) } for (i <- 1.to(5)) { println(i) } for (i <- 1 until 5) { println(i) } //求1-10的偶數 for (i <- 1 to 10 if i % 2 == 0) { println(i) }
3、break
import scala.util.control.Breaks object LoopTest{ def main(args: Array[String]) { val list = List("Hadoop","Hive","Scala") val loop = new Breaks loop.breakable{ for (x <- list) { println(x) if (x == "Scala") loop.break() } } println("loop over!") } }
4、元組tuple
/* * tuple 元組 * 語法: * val tuple = (變量1,...,變量22) * 特點: * ⑴元組的類型時Scala和Python中特有的; * ⑵在Scala中,元組是n個不同數據類型對象的一個聚合,n的最大值是22; * ⑶Map的元素實際上是n=2的元組,即2元組,也是最簡單的元組; */ //元組的遍歷 val tuple = (1,2,"Scala",1) for (x <- 0 until tuple.productArity) { println(tuple.productElement(x)) }
5、數組
/* * 數組是存儲相同類型的元素的固定大小的連續集合; * 數組的第一個元素的索引是數字0,最後一個元素的索引是元素的總數減去1; * Scala中數組的類型: * 定長數組 * 變長數組(scala.collection.mutable.ArrayBuffer) */ //定長數組(長度不可變):數組採用()訪問,而不是[],下表從0開始 val a = new Array[String](3) //Array[String] = Array(null,null,null) a.length //Int = 3 //不用new,直接將值寫在數組中,底層調用的是Object Array的apply方法 val b = Array("aa","bb","cc") b(1) //String = bb // b(3) 報錯:java.lang.ArrayIndexOutOfBoundsException:3 //變長數組 val c = scala.collection.mutable.ArrayBuffer[Int]() //+=/++=/-=/--=/insert/remove/toArray/sum/max/reverse c += 1 c += 2 c += (3,4) //++可以放置一個Array進去 c ++= Array(5,6,7,8) //在指定的位置插入指定的數據 c.insert(0,0) c //刪除指定位置的數據 c.remove(1) c //從第0個開始刪除3個 c.remove(0,3) //變成定長數組 c.toArray c.toArray.sum c.toArray.min //移除最後的兩個 c.trimEnd(2) c for (i <- 0 until c.length) println(i) for (ele <- c) println(ele) //排序 //scala.util.Sorting.quickSort(c) //將數組轉換成字符串 c.mkString(",") c.mkString("[",",","]")
//數組的遍歷 val arr=Array(1,2,3,4) for (x <- 0 until arr.length) { println(arr(x)) } for (x <- arr) { println(x) } //排序 val arr1 = scala.collection.mutable.ArrayBuffer(1,2,3,4) val arr2 = arr1.toArray scala.util.Sorting.quickSort(arr2) arr2 arr1.sorted //默認是升序排序