1. 程式人生 > >Scala程式設計快速入門

Scala程式設計快速入門

1.scala資料型別

上表中列出的資料型別都是物件,也就是說scala沒有java中的原生型別。在scala是可以對數字等基礎型別呼叫方法的。例如數字1可以調方法,使用1.方法名。scala擁有和java一樣的資料型別,和java的資料型別的記憶體佈局完全一致,精度也完全一致。

Unit:表示沒有返回值;

Nothing:表示沒有值,是所有型別的子型別,建立一個類就一定有一個子類是Nothing;

Any:是所有型別的超類;

AnyRef:是所有引用型別的超類

 

如上兩圖所示,可見所有型別的基類是Any。Any之後分為兩個AnyVal與AnyRef。其中AnyVal是所有數值型別的父型別,AnyRef是所有引用型別的父型別。

Scala還定義了底型別,其中Null型別是所有引用型別的底型別,所有AnyRef的型別的空值都是Null;而Nothing是所有型別的底型別和Any型別相對應,Null與Nothing都表示空。

String繼承自AnyRef。與Java,Scala中的String也是記憶體不可變物件,及所有的字串操作都會產生新的字串。

Int等基礎型別都是Scala包裝的型別,例如Int型別對應的是Scala.Int只是Scala包會被每個原始檔自動引用。

Option型別用來表示可能存在、也可能不存在的值。樣例子類:Some("Fred")表示包裝了某值。樣例:None表示沒有值。

2.宣告與定義

常量宣告

常量宣告使用“val”值不可改變。

val firstname : String = "wang"
val lastname = "xiaoming"        //可以省略型別

變數宣告

變數宣告使用“var”值可以改變。

var name:String = "sean"
var myname = "fengjia"    //可以省略型別

函式宣告

函式或者表示式的宣告使用“def”

object HelloScala {

  def main(args: Array[String]): Unit = {
    println(x)
    println(y)
  }
  val a = 3
  var b = 2
  val x = a * b          //定義常量名"x",會直接計算值
  def y = a * b          //這裡只是定義表示式名字"y",不計算值
  
}

3.字串

註釋

同java註釋相同:單行註釋“//”,多行註釋“/* **/”

字串

同java字串。

多行字串

  scala中可以定義多行字串

  var str =
    """
      hello 
      scala
    """

s字串

s字串可以呼叫“變數/常量”,在字串前面加s,在字串中使用“$變數/常量名”的數學表示式,來呼叫變數。字串之前不寫s,則原樣輸出。

    val name = "sean"
    println(s"hello $name")
    println("hello $name")

輸出:

hello sean
hello $name

f字串

在字串前加f使用格式化變數功能。變數名後面加%s是表示字串,變數名後面加%.2f是精確到百分位。

    val name = "sean"
    val height = 1.7
    println(f"hello $name%s is $height%.2f")
    println(s"hello $name%s")
    println("hello $name%s is $height%.2f")

輸出:

hello sean is 1.70
hello sean%s
hello $name%s is $height%.2f

R字串

在scala中如果要輸出“\t”、“\n”等字串時需要加轉義符“\”否則會按照製表符或換行符輸出。r字串的使用是在字串前面加raw,則可以將“\t”、“\n”等原樣輸出。

    println("a\tb")
    println(raw"a\tb")

輸出:

a	b
a\tb

4.Scala 函式

1.函式形式

函式簡化形式

Scala中,可以不寫return,如果不寫return則自動將最後一行作為返回值,如果沒有返回值,則函式的返回型別為Unit,類似於Java中void。

  def max(x:Int,y:Int)={
    if (x>y)
      x
    else
      y
  }

這裡還可以進一步把方法體的花括號也省略,所以函式可以進一步簡化為

  def min(x:Int,y:Int)=
    if(x<y)
      x
    else
      y

案例一(單個引數,引數設定初始值)

定義sayMyName方法,方法需要一個引數,型別是String,預設值是sean。如果使用引數則按照引數計算,如果不適用引數則使用預設值。

object HelloScala2 {

  def main(args: Array[String]): Unit = {
    sayMyName()
    sayMyName("jiafeng")
  }

  def sayMyName(name:String = "sean"): Unit ={
    println(name)
  }

}

案例二(可變引數)

多個相同型別的引數可以使用*表示,例如(k : Int*)表示多個Int型別的引數,具體數量不確定,類似於java中的可變引數。

  def main(args: Array[String]): Unit = {
    var sum = sumParam(1,2,3,4,5)
    println(sum)
  }

  def sumParam(n : Int *) ={
    var sum = 0
    for (i <- n){
      sum += i
    }
    sum
  }

案例三(下劃線做引數)

呼叫add方法使用下劃線是一個符號表示一個變數名。


  def main(args: Array[String]): Unit = {
    var add = add2(5)
    println(add)
  }

  def add(a : Int,b : Int) = a + b
  def add2 = add(_ : Int,1)

2.遞迴呼叫

遞迴實際上就是方法自己呼叫自己,也可以稱之為遞迴公式。


  def main(args: Array[String]): Unit = {
    var f = fact(9)
    println(f)
  }

  def fact(n : Int) : Int = {
    if(n <= 0){
      println("if:"+n)
      1
    }else{
      println("else:"+n)
      n * fact(n - 1)
    }
  }

執行結果

else:9
else:8
else:7
else:6
else:5
else:4
else:3
else:2
else:1
if:0
362880

3.柯里化函式

 

https://www.cnblogs.com/yangp/p/8575705.html