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