簡體   English   中英

Scala的好處是什么?

[英]What Are The Benefits Of Scala?

我是一名Java開發人員,我想知道如何在Java程序中使用Scala?

閱讀Daniel Spiewak關於Scala 的精彩博客系列 使用Scala,您可以保留:

  • 所有的Java庫
  • 在JVM上運行的所有優點(無處不在,管理工具,分析,垃圾收集等)

但是你可以編寫Scala代碼:

  • 比Java更簡潔明了(特別是使用更多功能樣式,例如在集合庫中)
  • 它有閉包和功能作為語言的一部分
  • 它有運算符重載(從使用的角度來看)
  • 它有mixins(即包含實現的接口)

另外,請看看Scala網站上最近的新聞帖:“ 研究:編程風格和生產力 ”。

在他的論文中, Gilles Dubochet描述了他如何使用眼動追蹤調查編程風格的兩個方面。 他發現使用for-comprehension和map的算法平均快30%,就像在Scala中那樣,而不是那些具有Java迭代while循環的算法。

新聞項目的另一個重要引用:

在Scala為電力貿易公司撰寫關鍵任務項目的Alex McGuire對Scala說:“簡潔意味着我可以在一個屏幕上看到更多的程序。你可以得到更好的概述。當我有一些數學模型可以用Java我必須保留兩個模型,數學模型本身,第二個模型是如何用Java實現它。使用Scala一個模型,數學模型,將會更有效率。“

你讀了帖子的其余部分和那里的其他鏈接項目。

從我有限的經驗中,我可以用非常簡單的語言命名一些極其明確的觀點:

  1. 屬性。 C ++和Java有一個公共getter / setter函數“property”的概念,它包含一個內部類變量,導致大量的樣板代碼。 C#將其形式化為一種真正的語言特性,並通過自動實現的屬性減少了C#3.0中的大部分樣板。 Scala類將簡單屬性定義為常規只讀val或讀/寫變量。 該類可能稍后選擇使用get或get / set方法替換它們而不影響客戶端代碼。 為此,Scala提供了最優雅的解決方案,具有最少的語言功能和復雜性。

  2. 數組使用常規泛型。 在Java / C#中,泛型作為一種思想被拴在一起,並且是完全獨立的但是與數組有重疊的行為。

  3. Scala具有不變的“val”作為一流的語言特征。 實際上,val類似於Java最終變量:頂部引用是不可變的,但內容可能會發生變異。

  4. Scala允許塊,for-yield循環和大括號中的代碼返回一個值。 在許多情況下,這是非常優雅的。 一個非常小的優點是,這消除了對單獨的三元運算符的需求。

  5. Scala具有單例對象而不是C ++ / Java / C#類靜態。 這是一個更清潔的解決方案

  6. 模式匹配。 對象拆包。 在很多情況下非常好。

  7. 原生元組。

  8. 持久不可變集合是默認集合並內置於標准庫中。

我不確定您是否可以在Java程序中輕松使用Scala,例如“從Java類調用Scala類”。

您可以按照“ 混合Java和Scala ”一文進行嘗試。
相關摘錄:

問題是Java和Scala編譯步驟是分開的:您不能一次編譯Java和Scala文件。
如果您的Java文件都沒有引用任何Scala類,則可以先編譯所有Java類,然后編譯Scala類。
或者,如果您的Scala文件都沒有引用任何Java類,那么您可以反過來這樣做。
但是,如果您希望Java類可以訪問您的Scala類,並且Scala類也可以訪問您的Java類,那就是一個問題。

Scala代碼可以很容易地直接調用Java代碼,但有時從Java代碼調用Scala代碼比較棘手,因為從Scala到字節碼的轉換並不像Java那么簡單:
有時,Scala編譯器會在符號中添加字符,或者在從Java調用時進行必須顯式處理的其他更改。
但是Scala類可以實現Java接口,並且該類的實例可以傳遞給期望接口實例的Java方法。
然后,Java類在該實例上調用接口方法,就像它是Java類實例一樣。

當然,正如Danup Spiewak的 Roundup:Scala for Java Refugees所述 ,情況正好相反

Scala或Java:

優點:

  • Scala支持功能性和命令式OO編程風格,並且它主張兩個模型彼此不沖突,但它們是正交的並且可以相互補充。 Scala不要求或強制程序員使用特定的樣式,但通常標准是在適當的時候使用帶有不可變變量的函數樣式(使用函數方法有一些好處,例如簡潔和簡短的語法以及通常使用純函數減少代碼中的非確定性和副作用的數量),同時在代碼看起來更簡單或更易理解時采用命令式編程。
  • Scala不要求; 在每行的末尾,它具有可選性,這導致更清晰的代碼
  • 在Scala中,函數是一流的cititzens
  • Scala支持一些直接用語言構建的高級功能,例如:Currying,Closures,高階函數,模式匹配,高階類型,Monads,隱式參數。
  • Scala可以與Java很好地交互,兩者都可以共存。 可以在Scala代碼中直接使用Java庫,從scala代碼調用Java類。
  • 使用語言構建的元組使得在幾種情況下生活更輕松
  • 支持運算符重載
  • 擁有豐富的生態系統,Apache中一些流行的開源項目就是基於它的。
  • 使用Scala Futures可以很容易地編寫異步和非阻塞代碼
  • Scala支持使用Akka的Actor模型,當在多線程和並行業務用例中運行分布式應用程序時,它可以高效且可擴展(強制封裝而不訴諸鎖定,actor的狀態是本地的而不是共享的,更改和數據通過信息)
  • 與Java相比,代碼往往更短(可能並非總是如此)

缺點:

  • 與Java和其他語言相比,陡峭的學習曲線需要更多時間從學習者那里清楚地理解所有概念。 有很多功能
  • 它不像Java那樣在市場上建立起來,因為它是后來發明的,所以Java總體來說更成熟,更經受戰斗考驗。
  • Scala打開了太多門。 它允許許多復雜的語法,如果以不負責任的方式使用,可能會導致難以理解的代碼。 濫用運算符重載,隱式參數和其他結構等內容可能適得其反,可能會破壞代碼的易讀性。
  • Java也在不斷發展,並且對於更新版本(例如使用JDK 9模塊)仍然越來越好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM