Scala編程快速入門

1.scala數據類型

上表中列出的數據類型都是對象,也就是說scala沒有java中的原生類型。在scala是能夠對數字等基礎類型調用方法的。例如數字1能夠調方法,使用1.方法名。scala擁有和java同樣的數據類型,和java的數據類型的內存佈局徹底一致,精度也徹底一致。html

Unit:表示沒有返回值;java

Nothing:表示沒有值,是全部類型的子類型,建立一個類就必定有一個子類是Nothing;函數

Any:是全部類型的超類;佈局

AnyRef:是全部引用類型的超類spa

 

如上兩圖所示,可見全部類型的基類是Any。Any以後分爲兩個AnyVal與AnyRef。其中AnyVal是全部數值類型的父類型,AnyRef是全部引用類型的父類型。scala

Scala還定義了底類型,其中Null類型是全部引用類型的底類型,全部AnyRef的類型的空值都是Null;而Nothing是全部類型的底類型和Any類型相對應,Null與Nothing都表示空。3d

String繼承自AnyRef。與Java,Scala中的String也是內存不可變對象,及全部的字符串操做都會產生新的字符串。code

Int等基礎類型都是Scala包裝的類型,例如Int類型對應的是Scala.Int只是Scala包會被每一個源文件自動引用。htm

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

相關文章
相關標籤/搜索