天天看點

Scala 簡介 優點 及 用途介紹:優勢:用途

scala 是一種有趣的語言。它一方面吸收繼承了多種語言中的優秀特性,一方面又沒有抛棄 java 這個強大的平台,它運作在 java 虛拟機 (java virtual machine) 之上,輕松實作和豐富的 java 類庫互聯互通。它既支援面向對象的程式設計方式,又支援函數式程式設計。它寫出的程式像動态語言一樣簡潔,但事實上它确是嚴格意義上的靜态語言。scala 就像一位武林中的集大成者,将過去幾十年計算機語言發展曆史中的精萃集于一身,化繁為簡,為程式員們提供了一種新的選擇。

個人覺得比較運作速度其實沒啥意義, 因為兩種語言都是生成 jvm 的位元組碼, 依賴 jvm 這個虛拟平台來跑代碼. 除非 scalac (scala的編譯器) 有重大 bug, 生成的位元組碼執行讓人無法接受, 否則基本上不會相差太多. 再說, scala 都到大版本2了, 這種機率實在是不大.

相比較與 java, 在下覺得 scala 最主要的有以下兩點優勢:

fp 泛型支援

如果用多了 spring 中大量的 template 接口, 你就會覺得 fp 其實還是蠻好用的.

而這僅僅是 fp 好處的冰山一角.

函數其實就是一個 <code>input -&gt; output</code> (scala 也是這麼表示一個函數的), 沒有任何副作用, 與狀态無關, 由于這種特性,

是以函數式的程式設計範式在分布式領域有很多好處

對于函數式程式設計,我的知識實在是皮毛, 但可以這麼說, fp 相對與 oo 有哪些優勢, scala 對于 java 差不多就有哪些優勢.

正因為 fp 有如此多的優勢, 是以 java8 才引入了 fp. 從某種程度上來說, java 認可了 scala 的做法.

類型系統支援

而我對與 scala 的類型系統的了解, 也還是皮毛.

正是以上這兩點大優勢, 造成了 scala 比 java 更加安全, 同時又具備靈活性, 想象力.

其他語言層面上的優勢

在 java 中, 你是否有時很想繼承多個 <code>abstractclass</code> 呢? 對不起, java 隻支援單繼承

在 scala 中, 你可以進行 mixin (java 8 也開始引入 default method 了呢)

在 java 中, 想要一個 singleton ? 要麼在 static block 中做, 要麼利用 enum 的單例特性完成, 或者其他更糾結的方法.

在 scala 中, 隻要聲明為 <code>object</code>, 即為單例.

在 java 中, 想要延遲加載一個單例? <code>double check</code>吧

在 scala 中, 隻要在 <code>object</code> 中将變量修飾為 <code>lazy</code> 即可

在 java 中, 想要對集合進行一些操作? 使用一層一層的 for 循環吧

在 scala 中, 使用 collection 的一些集合操作, 即可獲得如寫<code>sql</code>般的享受.

在 java 中, 在并發中想對<code>future</code>進行回調?

對不起, <code>future</code> 不是 listenable (無法支援回調), 除非你使用額外的工具(如 guava, spring)

在 scala 中, 本來就主張異步程式設計, future 和 promise 的配合讓人非常愉快.

在 java 中, 要透明擴充一個第三方庫的類怎麼辦? 包裝, 再加一層.

在 scala 中, 有強大的 implicit 機制讓你更優雅的做到這一點, 同時還能保證類型安全(比起 ruby 的 monkey patch, 要安全得多)

scala 的表達力很強, 相同功能的代碼, 用 java 和 scala 的行數不可同日而語.

這些單單是語言層面上的優勢, 除此之外, scala 還能無縫結合 java

盡管羅列了如此多的好處, 但 scala 有如下劣勢:

文法複雜, 學習曲線非常高

國内 scala 程式員很難找 (目前 scala 的影響力也在緩慢擴大, 比如 scala 社群中的明星 spark 的流行也在慢慢拉動 scala 的流行, 如同 rails 之于 ruby)

社群, 生态還比較小, scala 風格的庫還非常少(但可以和 java 很容易的斜街很多時候彌補了這一點)

相對于java而言,scala的代碼更為精簡(減低犯錯),而且功能更為廣泛(scala其實是scalable language 的簡稱,意為可擴充的語言),許多scala的特性和文法都是針對java的不足和弱點來設計的。

scala的特點是有很多函數程式語言的特性(例如ml,miranda, scheme,haskell),譬如惰性求值,list comprehension, type inference, anonymous function, pattern matching 等等,同時也包含 object-oriented 的特性(oo 能與 fp 混合使用是 scala 的亮點)。此外,許多相似于進階程式設計語言的文法也滲入其中(例如 python),不僅提高了 scala 代碼的可讀性,維護、修改起來也較為省時省力。

scala 與 java 文法上的明顯差異有:

不需要分号結尾

類型定義開頭需大寫(與 haskell 相同)

函數定義需 <code>def</code> 開頭(與 python、ruby 相同)

<code>return</code> 可以省略

在此值得提醒的是,統計顯示,scala 的代碼運作速率僅為 java 的 8 成。

spark 是用scala 開發的,可以做大資料,web等,其他功能 和java差不多