Scala vs Java:兩者間的差異與相似處

Scala 是新一代的 JVM 語言,作為最普及程式語言之一 Java 的替代選擇,正逐漸贏得用戶青睞。雖然 Scala 的普及度尚不及 Java,但正在逐步地迎頭趕上。有越來越多 Java 開發者學起 Scala,受到 Twitter 的影響,有越來越多公司開始使用 Scala,其前景看來可期。

首先,Scala 有許多地方與 Java 不同,但同時兩者又有許多相似之處,例如說 Scala 與 Java 都是基於 JVM 的語言。你可以用寫 Java 的方式寫 Scala,Scala 也可以使用所有的 Java 程式庫,我認為 Scala 設計者在此做了很棒的決定。因為在 Java 方面已經有龐大的開放源碼框架與程式庫可用,最好的做法是重複使用這些作品,而不是用 Scala 重新打造一份。

在許多差異中,Scala 與 Java 主要不同之處其中之一,是能運用函數式程式設計典範以及當代 CPU 的多核心架構。由於目前 CPU 的發展趨勢傾向增加更多核心,而非提高 CPU 時脈週期,這也有利於函數式程式設計模式。不過,當 Java 8 一旦加入 lambdas 之後,這項差異或許就此不在,但對此發表評論還嫌太早。除了函數式程式設計之外,兩者還有許多差異。其中很明顯的是可讀性的提高與程式碼的簡潔性。Java 常因為太過冗長而遭到批評,Scala 的確考慮到這一點,通常 5 到 6 行的 Java 程式,只需用 2 到 3 行 Scala 就能表達。在本文中,將介紹 Scala 與 Java 間的相似與差異之處。

Scala 與 Java 的相似點

以下是 Scala 與 Java 程式語言的某些主要相似處:

  1. 兩者都是基於 JVM 的語言。Scala 產生的是和 Java 一樣,並且在 Java 虛擬機器上運行的 byte code。Scala 的編譯器 scalac,類似於 Java 編譯器 javac,會把 Scala 程式碼編譯為 byte code。在這個層次上,所有 JVM 語言像 Groovy、JRuby、Scala 和 Java 沒什麼不同,因為都使用同樣的記憶體空間、型別系統,並在同樣的 JVM 中執行。
  2. 你可以從 Java 呼叫 Scala,反之亦可,兩者之間提供了完美的整合。再者,你可以在 Scala 中重用現有的應用程式碼與開源 Java 程式庫。
  3. 主要的 Java 程式設計 IDE 像 Eclipse、Netbeans、InetelliJ,都支援了 Scala。
  4. Scala 與 Java 之間另一個相似之處,是兩者都是物件導向,不過 Scala 進一步支援了函數式程式設計方法,這也是它的核心優勢之一。

Scala 與 Java 的不同處

  1. 在兩者間第一個也是主要的差異,是程式碼變得簡潔了。Scala 巧妙運用了型態推論 (type inference)、將一切視為物件、函數傳遞 (function passing),以及其他功能,大幅地減少了 Java 應用程式的程式碼行數。
  2. Scala 的設計能以優雅、簡潔、型態安全的方式,表達通用的程式設計模式。語言本身鼓勵開發者以不可變形式 (immutable style) 撰寫程式碼,簡化同時性與並行性的實現。
  3. 許多人或許不會注意到兩者在學習曲線上的差異。Scala 相對 Java 來說,擁有陡峭的學習曲線。雖然作為出於 Java 背景的作者而言,這個意見或許有些偏頗,但由於將豐富語意塞在精簡的程式碼中,Scala 可真是難以預測。和 Java 比較起來,Scala 的語法看來令人困惑又非賞心悅目,不過這一點應該只是初始障礙。克服它的辦法是找一本不錯的 Scala 書籍,像 Programming in Scala 或 Scala in Action。對於想要學 Scala 的 Java 開發者,這兩本都是絕佳參考書。
  4. 內建惰性求值 (lazy evaluation) 是 Scala 的特點之一,該特性允許將耗時運算,延遲至真正需要時才進行,你可以使用 lazy 這個關鍵字達到這個效果,如下列程式碼:

  5. // 影像載入很慢,所以只在需要秀圖時才載入
    lazy val images = getImages()  //用 lazy 關鍵字啓用惰性運算
    
    if(viewProfile){
        showImages(images)
    }
    else(editProfile){
        showImages(images)
        showEditor()
    }
    else{
        // 其他不需要載入影像的事
    }
    

    如果你喜歡從實例中學習,那麼我猜 Scala CookBook 會是你另一個不錯的選擇,其中針對 Scala 的不同功能,包含了數不清的範例。

  6. 有人會說 Java 的可讀性比 Scala,原因是 Scala 那些層層套疊的程式碼。由於你可以在某類別中的某個物件之中的某個函式裡的函式中,再定義函式,程式碼會變得極具巢狀結構。雖然某些時候有助於讓程式更清晰,寫得不好時程式會變得很不好懂。
  7. Scala 與 Java 之間的另一個差異,是 Scala 支援運算子多載。你可以對 Java 中的所有運算子進行多載,也可以為所有型態建立新的運算子。但 Java 並不支援運算子多載。
  8. Java 與 Scala 之間的另一項主要差別,是函式在 Java 中是物件。Scala 將所有方法與函式視為變數。這表示,你可以把它們像物件一樣傳遞。你可以看過在 Scala 程式碼中,有函式接受另一個函式作為參數。事實上這賦予該語言更強大的能力。
  9. 讓我們比較一下用 Scala 與 Java 撰寫的程式碼,看看有多少差別:

  10. Java:
    
    List<Integer> iList = Arrays.asList(2, 7, 9, 8, 10);
    List<Integer> iDoubled = new ArrayList<Integer>();
    for(Integer number: iList){
        if(number % 2 == 0){
            iDoubled.add(number  2);
        }
    }
    
    Scala:
    
    val iList = List(2, 7, 9, 8, 10);
    val iDoubled = iList.filter(_ % 2 == 0).map(_  2)
    

你可以看到 Scala 的版本比 Java 簡潔許多。當你開始學習函數式程式設計的概念和模式,你會看到更多這樣的例子。我迫不及待想看到 John Hunt 的 Scala Design Patterns: Patterns for Practical Reuse and Design,這本書雖然尚未發行還在預訂階段,但這個月應該就會發行。

雖然 Scala 與 Java 是兩個不同的程式語言,但彼此有許多共通點,這並非壞事,而且正是這點讓 Scala 可能成為 Java 的替代選擇。正如我在學習 Java 程式設計的 10 個理由 (10 reason to learn Java programming) 這篇文章中提到,Java 工具、程式庫、社群,是該語言的最大優勢,假如 Scala 能加以利用的話,將能夠大幅超前。對於 Java 程式設計者,我覺得學 Scala 沒什麼壞處,你可以會學到一些好的做法,甚至可以應用到 Java 上。由於企業部門仍舊以 Java 為主,Scala 還處於初期階段,如果你現在學 Scala 的話,可以搶先一步。總結來說,Scala 看來很有潛力,所有的設計決策都很不錯,在歷經 Java 多年經驗後。


給 Java 程式設計者的 Scala 推薦書籍

書是學習新程式語言的最佳途徑,首先它們以更具可讀性與權威的方式,呈現了完整的資訊。我強烈建議在投入部落格與線上文件前,先至少看一本書。鑒於 Scala 陡峭的學習曲線,讀 Scala 程式設計書籍以打好基礎是絕對必要的。你可以從以下我列出的書中挑選一本。

Programming in Scala: A Comprehensive Step-by-Step Guide,第二版,作者 Martin Odersky、Lex Spoon 與 Bill Venners
Scala for the Impatient,作者 Cay S. Horstmann
Scala in Depth,作者 Joshua D. Suereth 與 Martin Odersky


◎本文翻譯自 Java Revisited:
https://javarevisited.blogspot.tw/2013/11/scala-vs-java-differences-similarities-books.html




自由軟體鑄造場電子報 : 第 232 期 Scala vs Java:兩者間的差異與相似處
標籤: ,  
分類: 技術專欄