scala_mark_001

最近今天開始研究scala, 由於本人一直從事的是java相關開發, 所以寫一點感觸學習過程。


由java 學習scala 還是蠻有意思的, scala是基於jvm的,所以很多東西都是共通的,唯獨在編程思想上, 如何有函數式編程的思維、如何採用靜態類處理的方式。


下面是學習過程中的一些筆記:

========================================

1、scala 的特性:兼容性,簡短,高層級抽象和高級的靜態類別,
集合了erlang的多線程併發特性庫,java的無縫結合,高延伸性


2、Scala是很容易進入的語言。它跑在標準的Java平臺上,可以與所有的Java庫實現無縫交互。它也是用來編寫腳本把Java控件鏈在一起的很好的語言。但是用它來建立大系統和可重用控件的架構將更能夠發揮它的力量。 
從技術層面上來說,Scala是一種把面向對象和函數式編程理念加入到靜態類型語言中的混血兒。Scala的許多不同的方面都展現了面向對象和函數式編程的熔合;或許它比其他那些廣泛使用的語言更有滲透性。在可伸展性方面,這兩種編程風格具有互補的力量


=====================================
3、培育新的控制結構 
Java伴隨着一個豐富的,基於線程的併發庫。Scala可以像其他JavaAPI那樣使用它編程。然而,Scala也提供了一個實質上實現了Erlang的行動類模型的附加庫。 


行動類是能夠實現於線程之上的併發抽象。它們通過在彼此間發送消息實現通信。每個行動類都能實現兩個基本操作,消息的發送和接受。發送操作,用一個驚歎號表示,發送消息給一個行動類。
============================================


4、不可變是函數式語言的基石。
在Java和Scala裏,字串是一種數學意義上的字符序列。使用表達式如s.replace(';', '.')在字串裏替換字符會產生一個新的,不同於原字串s的對象。用另一種表達方式來說就是在Java裏字串是不可變的(immutable)而在Ruby裏是可變的。因此單看字串來說,Java是函數式語言,而Ruby不是。不可變數據結構是函數式語言的一塊基石。Scala庫在Java API之上定義了更多的不可變數據類型。例如,Scala有不可變的列表,元組,映射表和集。 


另一種說明函數式編程第二種理念的方式是方法不應有任何副作用:side effect。它們唯一的與所在環境交流的方式應該是獲得參數和返回結果。舉例來說,Java的String類的replace方法符合這個描述。它帶一個字串和兩個字符併產生一個所有一個字符都被另一個替代掉的新字串。調用replace不會有其他的結果。類似於replace這樣的方法被稱爲指稱透明:referentially transparent,就是說方法調用對任何給定的輸入可以用它的結果替代而不會影響程序的語義
============================================


5、Scala是靜態類型的 
    1)、可檢驗屬性。靜態類型系統可以保證消除某些運行時的錯誤
    2)、安全的重構。靜態類型系統提供了讓你具有高度信心改動代碼基礎的安全網。(因爲是靜態, 所以會提前檢查,避免重構過程中的其他錯誤)
    3)、文檔。靜態類型是被編譯器檢查過正確性的程序文檔 {
    比如
val x: HashMap[Int, String] = new HashMap[Int, String]()  可以寫成
val x = new HashMap[Int, String]() val x: Map[Int, String] = new HashMap() 
}


=========================================
6、定義變量:
val 類java 的final變量。
var 定義非final變量,可多次賦值。


==================================
7、類型推斷:type inference,這種Scala能自動理解你省略的類型的能力
如val msg = "hello world"
他會自動推斷爲java.lang.String類型。
==============================
8、函數定義:
 


可以存在既沒有參數也沒有返回值的函數:
def greet () = println("welcome to scala")
greet: ()Unit 當你定義了greet()函數,解釋器會迴應一個greet: ()Unit。“greet”當然是函數名。空白的括號說明函數不帶參數。Unit是greet的結果類型。Unit的結果類型指的是函數沒有返回有用的值。Scala的Unit類型比較接近Java的void類型,而且實際上Java裏每一個返回void的方法都被映射爲Scala裏返回Unit的方法。
===========================
9、獲取數組時,採用的是()而不是[], 如 args(0) 而非args[0];
scala 裏面沒有java的++ -- 自增,自減等操作。


===========================
10、while 循環
var i = 0
    while(i<args.length){
      print(" ")
      print(args(i))
      i+=1
    }
    println()
foreach 循環
args.foreach(arg => {
      print("-- ")
      println(arg)
    })
// or
args.foreach(arg => println(arg))


// 顯示類型的調用
args.foreach((arg : String) => println(arg))
//也可以採用這種方式,直接調用函數進行,不設置參數
args.foreach(println) 


=======================================
11、定義數組的時候必須設置數組元素對象的類型
帶類型的參數化數組
val greetStrings = new Array[String](3)   // 因爲是靜態類型,所有自動檢查識別爲正確的類型
greetStrings(0) = "Hello" 
greetStrings(1) = ", " 
greetStrings(2) = "world!\n"
for (i <- 0 to 2) 
print(greetStrings(i)) 


// 對數組的操作其實也是對立面每一個元素當作對象的操作
// 新建一個Array 的方式
// 採用 val greetStrings = new Array(3) 也是可以的


val greetStrings = new Array[String](3)
    greetStrings.update(0, "Hello")
    greetStrings.update(1, ", ")
    greetStrings.update(2, "world!\n")
    for (i <- 0.to(2))
      print(greetStrings.apply(i))


greetStrings.apply(i) 等同於 greetString(i)。


// 另外定義數組的方式, Array這個類提供的方法。
    var greetStrings = Array("one","twee","three")
    var greetStrings2 = Array.apply("one","twee","three")


======================================
12、從技術上講,Scala沒有操作符重載,因爲它根本沒有傳統意義上的操作符。取而代之的是,諸如+,-,*和/這樣的字符可以用來做方法名。因此,當第一步裏你在Scala解釋器裏輸入1 + 2,你實際上正在Int對象1上調用一個名爲+的方法,並把2當作參數傳給它。


=================================


13、使用list, 區別於java 的List, scala的List定義以後不可變。


=============================


14、元組:
val pair = (99, "Luftballons") 
println(pair._1) println(pair._2) 


獲取元組中的值不能使用類似 Array,List中的apply 是因爲元組中的對象可能是不同類型的。
元組的索引都是從1開始的, 區別於Array,List等從0開始。
========================================
15、Set 集合,默認情況下,使用的Set爲不可變集
var jetSet = Set("Boeing", "Airbus") 
jetSet += "Lear" 
println(jetSet.contains("Cessna")) 
Set 的可變集和不可變集
 
============================================


16、Map 也存在可變和不可變集


//默認是不可變的Map集合。

val immutableMap = Map(1->"go",2->"come",3->"out")

//可變集合
import scala.collection.mutable.Map 
val treasureMap = Map[Int, String]() 
treasureMap += (1 -> "Go to island.") 
treasureMap += (2 -> "Find big X on ground.") 
treasureMap += (3 -> "Dig.") 
println(treasureMap(2)) 

==========================================
17、簡單讀取文件:
 

val filePath = "/home/linfssay/Simple Project/simple.sbt"
//    if (!filePath.isEmpty){
//      for (line <- Source.fromFile(filePath).getLines)
//      println(line.length + " " + line) }
//    else
//      Console.err.println("Please enter filename")


    // another method
    // first、 change file line by Iterator to List
    val lines = Source.fromFile(filePath).getLines.toList
    val longestLine = lines.reduceLeft( (a, b) => if (a.length > b.length) a else b )
    val maxWidth = widthOfLength2(longestLine)
    for (line <- lines) {
      val numSpaces = maxWidth
//      widthOfLength(line)
      //declare space
      val padding = " " * numSpaces
      println(padding +" | " + line.length +" "+ line)
    }


  }


  // this define method return the value s.length as default
  def widthOfLength(s: String) = s.length.toString.length


  def widthOfLength2(s:String) : Int = {
    s.length.toString.length
  }







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