前一段時間在知乎上看到有人在討論Scala,感覺這門語言還挺有意思的,最近正好不是很忙,找了些時間看了一下,這里記錄一下學到的東西吧。
Scala是一門JVM上的FP+OO的語言,F(xiàn)P是函數(shù)式編程,與之對應的是命令式編程如JAVA,函數(shù)式編程有幾個特點:
- 函數(shù)是一等公民,函數(shù)可以作為參數(shù),返回值。
- 強調不變性,不是變量是表達式
- 函數(shù)沒有副作用,不依賴外部狀態(tài),也不會改變外部的狀態(tài),給定相同的輸入,都會有同樣的輸出
Scala的語法與JAVA有些相似,但是又有很大的區(qū)別,首先是變量的定義:
var one : Int = 1
val two : Int = 2
類型放在變量名的后面,用:隔開,var 是可從新賦值的變量,而val是不可重新賦值的,例如Java中的final 修飾的變量。同時類型可以省略,編譯器可以自動推斷出類型
var three = 3

函數(shù)定義
Scala 里函數(shù)的定義:
def max(a:Int,b:Int) :Int = {
if (a>b) a else b
}
我們可以看到函數(shù)的定義是用def 關鍵字,返回類型跟在括號后面。同時與Java不一樣的是,函數(shù)的定義與變量一樣需要用等號來連接。
如果你的函數(shù)體只有一個語句,可以把花括號去掉
def max(a:Int,b:Int) :Int= if (a>b) a else b
同時,我們可以省略返回類型,編譯器可以自動推測
def max(a:Int,b:Int)= if (a>b) a else b
上面說過,Scala是支持函數(shù)式編程的,函數(shù)可以當作參數(shù)和返回值,我們來定義一個參數(shù)是函數(shù)的函數(shù)
def calculate(f:Int=>Int,a:Int):Int = f(a)
我們定義了一個函數(shù)calculate,它有兩個參數(shù),f 和 a ,f的類型是Int=>Int ,表示這是一個函數(shù)類型,這個函數(shù)的參數(shù)是Int類型,返回值也是Int類型。我們來用一下這個函數(shù):
def sumOne(a:Int):Int=a+1
val result=calculate(sumOne,1)
看一下結果

Java要實現(xiàn)相同的方式就需要匿名類了,Scala確實要簡潔許多。設計模式里面的策略模式好像就是這個思想,只不過復雜化了。
Scala集合
Scala的集合主要有 List Set Map Tuple。
除了Tuple 其他的Java里面都有,Tuple翻譯成元組,它跟List很像,不過它里面可以放各種類型的元素,而List只能放相同類型的。
val ones=("1",1,1.0)
我們可以用->符號快速的構造兩個元素的元組
val pair = 1->"1"
Scala 里面集合分為兩種,可變集合和不可變集合,函數(shù)式編程崇尚不可變,Scala鼓勵使用不可變集合,但是也不限制你使用可變集合。Scala里默認的是不可變集合:
var lista=List(1,2,3)
var listb=4::lista
lista
首先創(chuàng)建了一個lista,里面有1,2,3然后我們用 :: 這個符號把4加到list里面,因為List是不可變的,所以scala新建了一個List返回給了listb,所以看到lista還是1,2,3。
