JVM語言
JVM上的語言越來越多了,從前幾年的groovy仲翎、Scala和Clojure谭确,現(xiàn)在又聽說一門Kotlin票渠。對于前三種語言,groovy算是JVM平臺上的動(dòng)態(tài)腳本語言昂秃,可以類比Python肠骆;Scala以其直逼C++的語言復(fù)雜度而出名蚀腿,但是該語言的流行是因?yàn)楦卟l(fā)(akka)和大數(shù)據(jù)處理(Spark)扫外;Clojure是JVM上的Lisp重現(xiàn),是純粹的函數(shù)式編程語言磁玉,它在實(shí)時(shí)計(jì)算(Strom)中承擔(dān)了一部分責(zé)任驾讲。
選擇Scala
我決定了解Scala的原因是高并發(fā)吮铭,以及它與Java具備良好的互操作性,因此我試圖在將來的項(xiàng)目中引入Scala掠拳,讓其負(fù)責(zé)項(xiàng)目的并發(fā)處理模塊碳想。
Scala令我刮目相看的地方還有,很多語言特性的設(shè)計(jì)就會讓你不自覺使用一些設(shè)計(jì)模式胧奔,或者說根本不需要設(shè)計(jì)模式龙填。例如:利用Trait可以輕易實(shí)現(xiàn)裝飾器模式岩遗、利用函數(shù)值可以輕易實(shí)現(xiàn)策略模式等宿礁。
在《Scala程序設(shè)計(jì)》這本書中,作者給出了Scala的幾個(gè)重要特性:
- 擁有基于事件的并發(fā)模型(從2.10+版本中開始轉(zhuǎn)向akka)
- 既支持命令式風(fēng)格控汉,又支持函數(shù)式風(fēng)格
- 是純面向?qū)ο蟮?/li>
- 可以很好得與Java混合
- 它強(qiáng)制使用自適應(yīng)靜態(tài)類型
- 它簡潔而有表現(xiàn)力
- 它構(gòu)建于一個(gè)微內(nèi)核之上
但是 Scala為什么在國內(nèi)不太火呢姑子?據(jù)說是復(fù)雜度太高街佑,黑魔法太多捍靠,導(dǎo)致學(xué)習(xí)曲線過于陡峭沐旨,對此我的看法是:Scala是一門密度很高的語言,它的作者好像很懶剂公,還是煩透了Java那過于冗余的代碼風(fēng)格希俩,Scala完全是為了少寫代碼而設(shè)計(jì)吊宋。我們在使用Scala的一些語法糖的時(shí)候纲辽,應(yīng)該兼顧可讀性,在不影響可讀性的情況下使用Scala的黑魔法璃搜。
團(tuán)隊(duì)在推廣使用Scala之前拖吼,要首先學(xué)習(xí)它的語言規(guī)范(官方的沒有?那就制定團(tuán)隊(duì)自己的)这吻,這時(shí)可以參考Effective Scala
本書主要內(nèi)容
通過前面的論述吊档,相比你也明白自己是否會選擇Scala了,跟隨下面的列表唾糯,可以大概了解下Scala的具體內(nèi)容了。
?類型推導(dǎo):Scala不同于其他靜態(tài)類型語言仔燕,它不要求開發(fā)者提供冗余的類型信息姻乓,定義變量的時(shí)候使用var和val学少,但是scalac會進(jìn)行類型推導(dǎo)禁偎,檢查類型引用是否得當(dāng)。這點(diǎn)使得Scala既有動(dòng)態(tài)語言的自由,又能在編譯時(shí)發(fā)現(xiàn)不少類型錯(cuò)誤枷遂。
函數(shù)值和閉包:函數(shù)可以當(dāng)作參數(shù)傳遞給函數(shù)沸移,可以從函數(shù)中返回,甚至可以在函數(shù)中嵌套辉哥,這些高階函數(shù)稱之為函數(shù)值。閉包是一種特殊的函數(shù)值,閉包中封閉或綁定了在另一個(gè)作用域獲上下文中定義的變量。
Trait和類型轉(zhuǎn)換:Trait就像一個(gè)擁有部分實(shí)現(xiàn)的接口,它提供了一個(gè)介于單一繼承和多重繼承的中間地帶福青,我們可以在某個(gè)對象實(shí)例中混入某些Trait祝谚,也可以在某個(gè)類的所有實(shí)例中混入。通過Trait可以輕易實(shí)現(xiàn)設(shè)計(jì)模式中的裝飾器模式意荤。
Scala的容器:Scala提供了常用的容器——List、Map和Set捐寥,其中List和Map都有可變(mutable)和不可變(immutable)兩種羹膳,但是Scala傾向于使用不可變對象。按照函數(shù)式編程思想妻怎,所有的變量都應(yīng)該是不可變的榛丢,這樣可以消除共享變量选侨,乃至消除競態(tài)條件。
模式匹配和正則表達(dá)式:在Scala里,模式匹配僅次于函數(shù)值和閉包,是使用第二廣泛的特性猾封。
并發(fā)編程:Java不適合并發(fā)編程的明證是磷箕,僅僅為了這個(gè)話題就足夠出一本書了——《Java并發(fā)編程實(shí)戰(zhàn)》殿衰,在Scala里,最開始是基于事件的模型進(jìn)行進(jìn)程間通信拴竹,本書介紹了Scala actor模型的概念∏ィ現(xiàn)在再學(xué)習(xí)Scala的并發(fā)編程饼齿,建議直接學(xué)習(xí)akka。可以參考:一個(gè)超簡單的akka actor例子
與Java互操作:將Scala代碼與Java或JVM上其他語言的代碼混合使用很容易挺邀,Scala和Java一樣乳蓄,都是編譯成字節(jié)碼魂奥。通過這一部分的學(xué)習(xí),我們可以明白在Java應(yīng)用中的哪一部分可以使用Scala來提高開發(fā)效率样勃,優(yōu)化軟件產(chǎn)品诵姜。
異常處理:Java中的checked Exception強(qiáng)制我們捕獲并不關(guān)心的異常,所以溜腐,一些程序員只放一個(gè)空的catch塊在那里壓制異常,而不是讓它們自然傳遞到正確的地方被處理蚤氏。即使是沒有壓制異常毁葱,也破壞了Java應(yīng)用的封裝性。在Scala中涵妥,我們可以處理關(guān)心的異常吵取,忽略其他的異常。