Scala之變量與函數

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  //默認是升序排序




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