《Scala程序設計》閱讀書摘

jopen 9年前發布 | 15K 次閱讀 Scala
 

JVM語言

JVM上的語言越來越多了,從前幾年的groovy、Scala和Clojure,現在又聽說一門Kotlin。對于前三種語言,groovy 算是JVM平臺上的動態腳本語言,可以類比Python;Scala以其直逼C++的語言復雜度而出名,但是該語言的流行是因為高并發(akka)和大數據處理(Spark);Clojure是JVM上的Lisp重現,是純粹的函數式編程語言,它在實時計算(Strom)中承擔了一部分責任。

選擇Scala

我決定了解Scala的原因是高并發,以及它與Java具備良好的互操作性,因此我試圖在將來的項目中引入Scala,讓其負責項目的并發處理模塊。

Scala令我刮目相看的地方還有,很多語言特性的設計就會讓你不自覺使用一些設計模式,或者說根本不需要設計模式。例如:利用Trait可以輕易實現裝飾器模式、利用函數值可以輕易實現策略模式等。

在《Scala程序設計》這本書中,作者給出了Scala的幾個重要特性:

  • 擁有基于事件的并發模型(從2.10+版本中開始轉向akka)
  • 既支持命令式風格,又支持函數式風格
  • 是純面向對象的
  • 可以很好得與Java混合
  • 它強制使用自適應靜態類型
  • 它簡潔而有表現力
  • 它構建于一個微內核之上

但是Scala為什么在國內不太火呢?據說是復雜度太高,黑魔法太多,導致學習曲線過于陡峭,對此我的看法是:Scala是一門密度很高的語言,它的作者好像很懶,還是煩透了Java那過于冗余的代碼風格,Scala完全是為了少寫代碼而設計。 我們在使用Scala的一些語法糖的時候,應該兼顧可讀性,在不影響可讀性的情況下使用Scala的黑魔法

團隊在推廣使用Scala之前,要首先學習它的語言規范(官方的沒有?那就制定團隊自己的),這時可以參考 Effective Scala

本書主要內容

通過前面的論述,相比你也明白自己是否會選擇Scala了,跟隨下面的列表,可以大概了解下Scala的具體內容了。

  1. 類型推導:Scala不同于其他靜態類型語言,它不要求開發者提供冗余的類型信息,定義變量的時候使用var和val,但是scalac會進行類型推導,檢查類型引用是否得當。這點使得Scala既有動態語言的自由,又能在編譯時發現不少類型錯誤。

  2. 函數值和閉包:函數可以當作參數傳遞給函數,可以從函數中返回,甚至可以在函數中嵌套,這些高階函數稱之為 函數值閉包 是一種特殊的函數值,閉包中封閉或綁定了在另一個作用域獲上下文中定義的變量。

  3. Trait和類型轉換:Trait就像一個擁有部分實現的接口,它提供了一個介于單一繼承和多重繼承的中間地帶,我們可以在某個對象實例中混入某些Trait,也可以在某個類的所有實例中混入。通過Trait可以輕易實現設計模式中的裝飾器模式。

  4. Scala的容器:Scala提供了常用的容器——List、Map和Set,其中 List和Map都有可變(mutable)和不可變(immutable)兩種,但是Scala傾向于使用不可變對象。按照函數式編程思想,所有的變量都應該是不可變的,這樣可以消除共享變量,乃至消除競態條件。

  5. 模式匹配和正則表達式:在Scala里,模式匹配僅次于函數值和閉包,是使用第二廣泛的特性。

  6. 并發編程:Java不適合并發編程的明證是,僅僅為了這個話題就足夠出一本書了——《Java并發編程實戰》,在Scala里,最開始是基于事件的模型進行進程間通信,本書介紹了Scala actor模型的概念。現在再學習Scala的并發編程,建議直接學習akka。可以參考: 一個超簡單的akka actor例子

  7. 與Java互操作:將Scala代碼與Java或JVM上其他語言的代碼混合使用很容易,Scala和Java一樣,都是編譯成字節碼。通過這一部分的學習,我們可以明白在Java應用中的哪一部分可以使用Scala來提高開發效率,優化軟件產品。

  8. 異常處理:Java中的checked Exception強制我們捕獲并不關心的異常,所以,一些程序員只放一個空的catch塊在那里壓制異常,而不是讓它們自然傳遞到正確的地方被處理。即使是沒有壓制異常,也破壞了Java應用的封裝性。在Scala中,我們可以處理關心的異常,忽略其他的異常。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!