1. 程式人生 > >scala筆記-基礎語法(1)

scala筆記-基礎語法(1)

宣告變數
·宣告val變數:可以宣告val變數來存放表示式的計算結果。 eg:val result = 1 + 1,後續這些常量是可以繼續使用的,eg: 2 * result ·但是常量聲明後,是無法改變它的值的,eg:result = 1,會返回error: reassignment to val的錯誤資訊。
·宣告var變數:如果要宣告值可以改變的引用,可以使用var變數。 eg:val myresult = 1,myresult = 2

但是在scala程式中,通常建議使用val,也就是常量,因此比如類似於spark的 大型複雜系統中,需要大量的網路傳輸資料,如果使用var,可能會擔心值被錯誤的更改。

在Java的大型複雜系統的設計和開發中,也使用了類似的特性,我們通常會將傳遞給其他模組 / 元件 / 服務的物件,設計成不可變類(Immutable Class)。在裡面也會使用java的常量定義,比如final,阻止變數的值被改變。從而提高系統的健壯性(robust,魯棒性),和安全性。

·指定型別:無論宣告val變數,還是宣告var變數,都可以手動指定其型別,如果不指定的話,scala會自動根據值,進行型別的推斷。eg:val name: String = null ·eg:val name: Any = “leo”
·宣告多個變數:可以將多個變數放在一起進行宣告。eg:val name1, name2:String = null ·eg:val num1, num2 = 100

資料型別與操作符
·基本資料型別:Byte、Char、Short、Int、Long、Float、Double、Boolean。

乍一看與Java的基本資料型別的包裝型別相同,但是scala沒有基本資料型別與包裝型別的概念,統一都是類。scala自己會負責基本資料型別和引用型別的轉換操作。

使用以上型別,直接就可以呼叫大量的函式,eg:1.toString(),1.to(10)。
型別的加強版型別:scala使用很多加強類給資料型別增加了上百種增強的功能或函式。

eg: String類通過StringOps類增強了大量的函式,“Hello”.intersect(" World")。

eg: Scala還提供了RichInt、RichDouble、RichChar等型別,RichInt就提供了to函式,1.to(10),此處Int先隱式轉換為RichInt,然後再呼叫其to函式

·基本操作符:scala的算術操作符與java的算術操作符也沒有什麼區別,比如+、-、*、/、%等,以及&、|、^、>>、<<等。 ·但是,在scala中,這些操作符其實是資料型別的函式,比如1 + 1,可以寫做1.+(1)

eg: 1.to(10),又可以寫做1 to 10
·scala中沒有提供++、–操作符,我們只能使用+和-,比如counter =1,counter++是錯誤的,必須寫做counter += 1.


函式呼叫與apply()函式

函式呼叫方式:在scala中,函式呼叫也很簡單。
eg: import scala.math._,sqrt(2),pow(2, 4),min(3, Pi)。
不同的一點是,如果呼叫函式時,不需要傳遞引數,則scala允許呼叫函式時省略括號的,eg: “Hello World”.distinct ·apply函式
·Scala中的apply函式是非常特殊的一種函式,在Scala的object中,可以宣告apply函式。而使用“類名()”的形式,其實就是“類名.apply()”的一種縮寫。通常使用這種方式來構造類的物件,而不是使用“new 類名()”的方式。
eg: “Hello World”(6),因為在StringOps類中有def apply(n: Int): Char的函式定義,所以"Hello World"(6),實際上是"Hello World".apply(6)的縮寫。
eg: Array(1, 2, 3, 4),實際上是用Array object的apply()函式來建立Array類的例項,也就是一個數組。


scala的正則表示式支援
定義一個正則表示式 使用String類的r方法
val pattern1 = "[a-z]+".r

此時返回的型別是scala.until.matching.Regex型別
獲取一個字串中匹配正則表示式的部分,使用findAllIn

for (matchString <- pattern1.findAllIn(str))
println(matchString)

findFirstIn:獲取第一個匹配正則的部分

pattern1.findFirstIn(str)

replaceAllIn:替換匹配正則部分

pattern1.replaceAllIn("str","str2")

replaceFirstIn:替換第一個匹配正則部分

pattern1.replaceFirstIn("str","str2")

提取器

提取器就是一個包含unapply方法的物件,與apply相反
apply:接收一堆引數構造出來的物件
unapply:接收一個字串,解析出物件的屬性值

 class Person(val name:String,val age:Int)

  object Person{
    def unapply(str:String)={
      val splitIndex =str.indexOf("")
      if(splitIndex == -1) None
      else Some((str.substring(0,splitIndex),str.substring(splitIndex +1)))
    }
  }
  val Person(name,age) = "leo 25"
  name
  age
樣例類提取器

類似於javaBean

case class Person(name:String,age:Int)
val p = Person("leo",25)
 p match{
     case Person(name,age)=> println(name +":" + age)
 }