Java 8會打敗Scala嗎?

banq發表於2014-05-14
原文網址 : http://jdon.com/46371
我們知道基於JVM的Scala是一種函式式語言,現在Java 8也推出了lambda等函式式功能,那麼現在我們有了三種疑問:
1. Scala會不會替代Java?
2. Java會不會替代Scala
3. Java程式設計師是否有必要學習Scala?

對於這三個疑問,我的觀點是:
1. Java 自身也在演化發展,輕言Scala會替代Java恐怕為時過早。
2. Scala和Java 8現在處於戰略相持階段,雖然Scala優勢還比較明顯,但是肯定不如Java 8出現之前了。
3. 掌握了Java 8等函式程式設計特點,會幫助你更容易學習Scala。

首先我們要對Scala進行精確定位,從某種程度上講,Scala並不是一個純粹的面向函式的程式語言,有人認為 Scala是一個帶有閉包的靜態物件導向語言),更準確地說,Scala是面向函式與物件導向的混合,而Java 8以後的Java也可以算是一種物件導向+面向函式的混合了。

Scala主要特點是比Java更豐富的型別推斷,不需要像Java那樣死板地宣告型別,這主要歸結於Scala強大智慧的編譯器。型別推斷的好處其實因人而異,太玄了可能會影響程式碼的可理解性。所以,Scala有時會出現編譯時間比較長,因為機器自己理解程式碼也需要一點時間啊。

當然,Scala還有很多Java沒有的功能:模式匹配 implicits、traits、macros 、currying等等,除了這些新特點不一定都是函數語言程式設計核心功能以外,這些非常棒的語法對一般程式設計師可能還需要一個接受過程。

既然Scala設計的初衷是面向函式FP,而Java起家是物件導向OO,現在兩者都是OO和FP的混合語言,是否可以這麼認為:Scala = FP + OO,而Java = OO+ FP。

那麼,Scala 與Java的PK就變成了“OO為主FP為輔”與“FP為主OO為輔”的PK了。

由於物件導向OO和麵向函式FP兩種正規化是類似橫座標和縱座標的兩者不同座標方向的思考方式,類似資料庫和物件之間的不匹配阻抗關係,兩者如果結合得不好恐怕就不會產生1+1>2的效果。

物件導向是最接近人類思維的方式,而面向函式是最接近計算機的思維方式。如果你想讓計算機為人的業務建模服務,那麼以OO為主;如果你希望讓計算機能自己透過演算法從大資料中自動建模,那麼以FP為主。所以,Java可能還會在企業工程類軟體中佔主要市場,而Scala則會在科學計算大資料分析等領域搶佔Java市場,比如Scala的Spark大有替代Java的Hadoop之趨勢。

Scala另外還在Reactive Stream等非同步流式程式設計中試圖有所突破,總體來說,Scala面臨Java 8及其後續版本的阻擊,其函式程式設計的優勢正在慢慢被蠶食,而Scala必須在一個新的領域能將Java一招致命,我個人比較看好以Scala的Akka框架為代表的方興未艾的Reactive程式設計。

[該貼被banq於2014-05-14 17:35修改過]

相關文章