##回顧
之前通過實驗樓的課程已經對scala語言有了初步的瞭解 ,做了一些運算/重載/函數式編程的小Demo .但是不少細節還是模糊的 ,剛好看到 Programming In Scala 這本書 ,是scala作者寫的指導書 .原版實在是有難度 ,所以決定先看中文 .
開展
計劃就是跟着書的章節進行學習 ,結合之前的思考 ,細化理解 .爲了方便書寫運行代碼(多寫纔是硬道理) ,所以就直接在Intellij裏面寫了個工程 ,理解寫成註釋 ,代碼直接運行 .
博客內可能看着比較彆扭 ,有興趣的可以下載工程查看GitHub
第一章 Scala的概況和歷史
package SecondWithProgrammingInScala.Chapter1
/**
* Scala名稱來自於scalable(可伸縮的) language ,它的設計目的就是爲了方便使用者的擴展(如自己構造的if(){}的語法糖函數)
* Scala運行在JVM上 ,可以與Java無縫連接(編譯後都是class碼) ,也可以作爲腳本使用(還有命令行解釋器)
* Scala = JS (弱類型) + Java(面向對象) + C(函數式編程)
* 每一門語言有着他的特性和優缺點 ,有着侷限性和適用性
* Scala給你多種特性去自由選擇 ,需要對象就class ,需要函數就用函數特性
*
*/
/**
* Scala屬於高級語言 ,每一句代碼都具有很強的目的性 ,不使用分號和類型註釋 ,顯得乾淨準確
* "關聯映射"?
*/
object Part1 {
var capital = Map("US" -> "Washington", "France" -> "Paris")
capital += ("Japan" -> "Tokyo")
println(capital)
/**
* Scala可以讓使用者進行擴展和修改 ,可以從語言層面上進行修改
* 例如BigInt不屬於原生類型(Int/Char/Boolean等) 但是也可以像內建類型一樣使用+/-等算數方法和整數進行計算
* 如果換成Java裏面的類型就不那麼自由了
*/
def factorial(x: BigInt): BigInt =
if (x == 0) 1 else x * factorial(x - 1)
/**
* 使用Java裏面定義的大整型 ,相比之下因爲函數名和語法的限制 ,運算顯得很臃腫
*/
import java.math.BigInteger
def factorial(x: BigInteger): BigInteger =
if (x == BigInteger.ZERO) BigInteger.ONE
else x.multiply(factorial(x.subtract(BigInteger.ONE)))
/**
* 可變的控制結構 ,書中的scala actor已經廢棄 ,因此用另一個例子說明
* 可以看到 ,我自己書寫了一個if2 ,他使用起來和內置的if幾乎一樣(只作爲控制結構變換展示)
*/
def if2(assertion: => Boolean)(method: => Any) {
if (assertion) method //如果判斷條件成立 則執行條件體內的方法
else println("不成立")
}
if2(1 == 2) {
println("成立")
}
}
/**
* scala是面向對象的
* 它包含class/object ,也有着trait/abstract的設計 ,也有private/protect的訪問限制
* 調用方法也是可以通過 class.xxx 調用類和對象的方法 ,只是語法上做了簡化
*/
object Part2 {
//弱類型 自動判斷
val one = 1
//強類型 指定
val two: Int = 2
//直接使用 + 函數
val three = one + two
//實際是調用的 Int.+ 函數
val four = three.+(1)
/**
* scala是函數式的
* 函數是頭等值 ,與整數字符串同等地位 ,函數可以作爲參數傳遞 ,可以在函數中做在其他地方能做的任何事
* 程序的輸入值應該映射成輸出值 ,而不是加以修改(返回new) ,鼓勵使用不可變數據結構 ,方法透明(用方法的返回替代輸出值)
*
* 從很多設計可以看出 ,作者是想要大家使用函數式的代碼方式 ,減少var的使用 ,ifelse攜帶返回
*/
}
/**
* 兼容 :Java交互 .底層JVM .
* 簡潔 :能省則省 ,還可以改變函數控制結構去省(交給編譯器解釋 ,編譯的時間會更長)
* 高層抽象 :使用更具體的函數foreach(e=>{}) 或是 _ 函數字面量 ,可以省略很多代碼
* 高級的靜態類型化 :靜態類型可以避免布爾型不會與整數型相加;增加類型推斷/隱式轉換減少定義強類型的情況
*/
object Part3 {
/*這是一個Java類
class Message {
private String msg;
public Message (String msg) {
this.msg = msg;
}
public boolean hasUpperCase() {
boolean result = false;
for (int i = 0;i < msg.length;i ++){
if (Character.isUpperCase(name.charAt(i))) {
result = true;
break
}
}
return result
}
}
*/
//上面的java代碼使用scala
class Message(msg: String) {
def hasUpperCase: Boolean = {
msg.exists(_.isUpper)
}
}
//弱類型 隱式轉換
val i = 'i'
val i1 = i + 1
println(i1)
//隱藏的類型規則 會及時提醒錯誤
//val i2: Char = i + 2
//val T = true + 1
//除去重複的定義
import scala.collection.immutable.HashMap
//val x: HashMap[Int, String] = new HashMap[Int, String]
val y: HashMap[Int, String] = new HashMap
}
/**
* scala的特點就是集衆家之長
* 語法上主要藉助Java和C#(他們的句法來自於C/C++) ,
* 和Java一樣的 表達式/句子/代碼塊 ,類/包/引用 ,基本類型/類庫 ,和執行模式(.class->JVM)
*
* 統一對象模型來自Smalltalk(也影響了Ruby)
* 通用嵌套思想 ,類/函數/變量都能互相嵌套 ,出現在Algol/Simula
* 方法調用和字段選擇的統一訪問原則來自Eiffel
* 函數式編程的處理方式則以SML/OCaml/F#爲代表的ML系列語言相近 ,一些高階函數也出現在ML和Haskell中
* 隱式參數來自Haskell的類型類
* 基於actor的併發庫(akka.actor)來自於Erlang的思想
*
* Iswim/Smalltalk -> 把前綴操作符視爲函數 1.+(1) ;允許函數字面量(或代碼塊)作爲參數 ,從而定義控制結構
* C++ -> 重載操作符 ;模板
* 多種函數式語言中也引入了對象
*/
object Part4 {
}
/**
* 多多練習
* Java->Scala 需要更多了了解他的類型系統和函數式編程思想
*/
object Part5 {
}
object Chapter1App {
def main(args: Array[String]): Unit = {
//Part1
Part3
}
}