Java 8會打敗Scala嗎?
我們知道基於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程式設計。
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修改過]
相關文章
- 棄用 Java 8 和 Scala 2.12!Apache Kafka 3.0.0 上線JavaApacheKafka
- Java8仍占主導地位,Java11已破防,Java17浪潮還會來嗎?Java
- AI訓練的空洞騎士能打敗大黃蜂小姐姐嗎?AI
- 這麼簡單,還不會使用java8 stream流的map()方法嗎?Java
- jenkins 打安卓包失敗Jenkins安卓
- 從 Java 到 Scala(四):TraitsJavaAI
- 從 Java 到 Scala(二):objectJavaObject
- Scala與Java的關係Java
- Java內部類你真的會嗎?Java
- Java好學嗎?完全沒經驗能學會嗎?Java
- 贈你13張圖,助你20分鐘打敗了「V8垃圾回收機制」!!!
- 3/8打卡
- java finally一定會執行嗎Java
- java.util.Date會被棄用嗎?Java
- 【Java8新特性】重複註解與型別註解,你真的學會了嗎?Java型別
- Java集合詳解8:Java集合類細節精講,細節決定成敗Java
- 學會這些打敗 99%的同行!如何做高段位的軟體測試
- 在Java中,你真的會日期轉換嗎Java
- 細思極恐-你真的會寫java嗎?Java
- 細思極恐 - 你真的會寫 Java 嗎?Java
- Java 8 Lambda表示式一看就會Java
- scala和java資料型別轉換Java資料型別
- 從 Java 到 Scala (三): object 的應用JavaObject
- Scala與Java差異(三)之函式Java函式
- Akka系列(五):Java和Scala中的FutureJava
- scala陣列與java陣列對比陣列Java
- Java的快速失敗和安全失敗Java
- Java中執行緒池,你真的會用嗎?Java執行緒
- 你真的會寫單例模式嗎——Java實現單例模式Java
- Java程式設計師會越老越吃香嗎?Java程式設計師
- Scala與Java差異(五)之Map與TupleJava
- 從 Java 到 Scala(一):物件導向談起Java物件
- 還不會K8S嗎?先從kubeadm開始吧K8S
- dubbo傳送過程編碼失敗,會喚醒傳送執行緒嗎?執行緒
- oracle rac 打PSU補丁30805461兩個問題(Java版本及空間不足導致失敗)OracleJava
- Scala
- 這幾種Java異常處理方法,你會嗎?Java
- 學會Java開發才能學習大資料嗎?Java大資料
- 聯想常程:聯想手機將在2000價位段會全面打敗小米和榮耀