Scala 的預期目標是將面向對象、函數式編程和強大的類型系統結合起來,同時仍然要能寫出優雅、簡潔的代碼。 php
Scala 視圖將如下三組對立的思想融合到一種語言中: 算法
面向對象編程是一種自頂向下的程序設計方法,將代碼以名詞(對象)作切割,每一個對象有某種形式的標識符(self/this)、行爲(方法)和狀態 (成員變量)。識別出名詞而且定義出它們的行爲後,再定義出名詞之間的交互。實現交互時,必須將這些交互放在其中一個對象中(而不能獨立存在)。現代面向 對象設計傾向於定義出」服務類「,將操做多個領域對象的方法集合放在裏面。這些服務類雖然也是對象,但一般不具備獨立狀態,也沒有與它們所操做的對象無關 的獨立行爲。 編程
函數式編程方法經過組合和應用函數來構造軟件。函數式編程一般傾向於將軟件分解爲其須要執行的行爲或操做,並且一般採用自底向上的方法。函數式編 程:對不可變性的強調有助於編寫併發程序,視圖將反作用推遲到儘量晚,提供了很是強大的對事物進行抽象和組合的能力。消除反作用使得對程序進行推理 (reasoning)變得容易。 併發
對比: 函數式編程
面向對象編程 | 函數式編程 |
對象的組合(名詞) | 函數的組合(動詞) |
封裝有狀態的交互 | 推遲反作用 |
迭代算法 | 遞歸算法 |
命令流 | 延遲計算 |
… | 模式匹配 |
… | |
協變,Convariance,+T or ? extends T:類型能夠強制轉換爲子孫類;
逆變,Contravariance,-T or ? super T:類型能夠強制轉換爲祖先類;
不變,Invariance :類型徹底不能被強制轉換。 函數
函數式編程的精髓在於儘量地推遲反作用。 性能
Scala 作了如下幾個設計決策來提升代碼表達力: 優化
操做符(operation notation)是 Scala 的一個能力,能夠把方法看成操做符。無參數的方法能夠用做後綴操做符,只有一個參數的方法能夠看成中綴操做符;方法名的最後一個字符若是是冒號 」:「,則方法的調用方向反轉。 this
在定義匿名函數時(又稱 lambda),Scala 提供了佔位符語法。能夠用 「_」 關鍵字做爲函數參數的佔位符。若是使用多個佔位符,每一個相應位置的佔位符對應於相應位置的參數。 spa
用好隱式轉換是操縱 Scala 類型系統的關鍵。隱式轉換的基礎應用場景是按需自動地把一種類型轉換爲另外一種,但它也能夠用於有限形式的編譯時元編程。要使用隱式轉換必須把它關聯到某個做用域,能夠經過伴生對象或明確導入來作關聯。
HotSpot 編譯器的優化技術:
http://coderbee.net/index.php/scala/20150711/1262