用Java語言開發許久了,一直接觸指令式的語言開發,同時也做的多了,也逐漸感覺到了靜態語言的一些弊病。Scala的出現,可以使Java程序員平滑的過度,Scala語言也是運行在JVM上的,可以與Java無縫交互;Scala是面向對象的,可以通過提升接口的抽象級別來幫助管理復雜性。Scala是簡潔的,Scala程序員曾報告說,與Java比起來,它的代碼行數可以減少到Java的1/10,哈哈,是不是有些夸張呢?個人覺得,如果能減少三分之一,就非常成功了;Scala是靜態的,它以Java的內嵌類型系統為基礎,允許使用泛型參數化類型,用交集組合型類型和抽象類型隱藏實現細節,從而能夠設計出安全而又能靈活使用的接口。 

    我們先來安裝Scala的開發包,我的版本是scala-2.9.0.1.zip,安裝方式解壓就可以,環境變量和Jdk的沒什么區別,指向到bin目錄下就可以了,打開dos窗口,運行scala,出現下面結結果就表示安裝成功了 
    
 

    好了,讓我們開始Scala之旅吧。 
    在Scala中,分號是可選的,你可以寫或者不寫;定義類和構造函數,Java中一般這么寫 
Java代碼  收藏代碼
  1. public class MyTest {  
  2.   
  3.     private int id;  
  4.       
  5.     private int index;  
  6.       
  7.     public MyTest(int id, int index) {  
  8.         this.id = id;  
  9.         this.index = index;  
  10.     }  
  11. }  

而在Scala中,可以這么寫 
Java代碼  收藏代碼
  1. class MyTest(id: Int, index: Int)  

除了這些特性,尤其值得一提的是Scala是靜態類型的語言,它支持指令式的編程,但更推薦的使用函數式的編程。比如下面的代碼 
Java代碼  收藏代碼
  1. object HelloWorld {  
  2.   
  3.   def main(args: Array[String]): Unit = {  
  4.     var i = 0  
  5.     while(i < args.length) {  
  6.       println(args(i))  
  7.       i += 1  
  8.     }  
  9.   }  
  10.   
  11. }  

我可以使用scalac HelloWorld.scala使他生成class字節碼,也可以直接在JVM上執行, 
scala HelloWorld.scala Hello World 
打印結果將是 Hello World 
大家不覺得這樣有一丁點兒復雜嗎,來看看Scala的函數式的編程是什么樣的 
Java代碼  收藏代碼
  1. object HelloWorld {  
  2.   
  3.   def main(args: Array[String]): Unit = {  
  4.     args.foreach(arg => print(arg + " "))  
  5.   }  
  6.   
  7. }  

arg就是你臨時定義的變量,Scala默認為其開辟了臨時的String變量arg。 

體驗了最初的簡單函數式風格,我們再看下Scala中如何使用數組,在Java中,使用一個最簡單數組是這樣的 
Java代碼  收藏代碼
  1. public class ArrayTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         String[] strs = new String[]{"Hello", "World", "!"};  
  5.         for(String str : strs) {  
  6.             System.out.println(str);  
  7.         }  
  8.     }  
  9. }  

在Scala中,同樣是通過new來實例化對象,實例化過程中,可以用值和類型使對象參數化,使用值參數化實例可以通過把值傳遞給構造器的圓括號來實現,比如,Scala中數組是這么實現的,值得一提的是,在Scala中,數組是可變數據結構,這是和Java中有區別的地方 
Java代碼  收藏代碼
  1. object ArrayTest {  
  2.   
  3.   def main(args: Array[String]): Unit = {  
  4.     var greetString = new Array[String](3)  
  5.     greetString(0) = "Hello"  
  6.     greetString(1) = "World"  
  7.     greetString(2) = "!"  
  8.       
  9.     for(i <- 0 to 2) {  
  10.       println(greetString(i))  
  11.     }  
  12.   }  
  13.   
  14. }  


i <- 這個表達式是表示左邊的涵蓋在右邊范圍之內。 
下面我們來看看List,在Java中,List是可變的結構序列,而在Scala中,List是不可變的,在Scala中,List是不可變的數據結構,這么設計是為了函數式編程而設計的,奇特的是,Scala中并不需要通過new來創建List對象,比如下面一個例子,我創建了兩個集合,并且把它們循環打印出來。 
Java代碼  收藏代碼
  1. def main(args: Array[String]): Unit = {   
  2.     var list1 = List("aaa", "bbb", "ccc")  
  3.     var list2 = List("ddd")  
  4.     var list3 = list1 ::: list2  
  5.     list3.foreach(list => print(list + " "))  
  6.   }  

打出的結果就是 aaa bbb ccc ddd 

我們再來看看Set和Map,Scala致力于充分利用函數式和指令式兩方面的好處,所以它的集合庫區分為可變型和不可變型,都承接與Set,他們分別在Scala的不同包里。在Java中,我們稱為“實現”了接口,而在Scala中,我們稱為“擴展”或“混入”,下面我分別用Scala中的HashSet和HashMap的不可變數據類型,來做例子 
Java代碼  收藏代碼
  1. object SetTest {  
  2.   
  3.   def main(args: Array[String]): Unit = {  
  4.     var set = HashSet("b", 3, "c")  
  5.     set += "very"  
  6.     set.foreach(value => print(value + " "))  
  7.   }  
  8.   
  9. }  


這是Set的,下面是關于Map的 
Java代碼  收藏代碼
  1. object MapTest {  
  2.   
  3.   def main(args: Array[String]): Unit = {   
  4.     var map = HashMap(1 -> "a", 2 -> "b", 3 -> "c")  
  5.     map += (4 -> "d")  
  6.     map.foreach(value => print(value + " "))  
  7.   }  
  8.   
  9. }  

Scala的程序,只要后綴名命名為.scala就可以了。同時Eclipse也內置了對Scala的支持,安裝插件的網址是http://download.scala-ide.org/nightly-update-wip-experiment-2.9.0.final 
大家可以自行安裝,安裝完后就可以在Eclipse中運行了,如下圖 
 

現在對函數式編程有個了最初體會了