Scala學習整理[第一章 可伸縮的語言]

##回顧
之前通過實驗樓的課程已經對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
  }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章