1. 程式人生 > >scala入門總結二

scala入門總結二

1、scala中所有的集合都來自於scala.collection包及其子包mutable, immutable當中
預設使用的都是immutable集合,如果要使用mutable集合,需要在程式中引入
//由於immutable是預設匯入的,因此要使用mutable中的集合的話
//使用如下語句
val numSet=mutable.Set(1,2,3)
//如果對插入的順序有著嚴格的要求,則採用scala.collection.mutalbe.LinkedHashSet來實現
val linkedHashSet=scala.collection.mutable.LinkedHashSet(3.0,5)


2、var omap = new scala.collection.mutable.HashMap[String,Int]()
omap.put("java",1)
omap.put("scala",2)
for(i<-omap) println(i)
omap.contains("java")
omap.get("scala")
因為預設是immutable,是不可以變的,所以不能呼叫omap.clear()
但是我們這裡宣告的是mutable,可以直接呼叫clear()清空omap
3、//immutable queue
var queue=scala.collection.immutable.Queue(1,2,3)
//出隊
queue.dequeue
//入隊
 queue.enqueue(4)
//mutable queue
var queue=scala.collection.mutable.Queue(1,2,3,4,5)
//入隊操作
queue += 5
//集合方式
queue ++= List(6,7,8)


三、Option,None,Some型別
//通過模式匹配得到最終的結果 
def show(x:Option[Int]) =x match{ 
| case Some(s) => s 
| case None => “????” 
| } 
show(omap.get("age"))


四、函式字面量 function literal,   =>左側的表示輸入,右側表示轉換操作
Array(1,2,3,4) map{(x:Int)=>x+1} mkString(",")
如果只有一個引數
Array(1,2,3,4) map(x=>x+1) mkString(",")


五、閉包(Closure)
//(x:Int)=>x+more,這裡面的more是一個自由變數(Free Variable),more是一個沒有給定含義的不定變數
//而x則的型別確定、值在函式呼叫的時候被賦值


六、類和物件
1、雖然我們只在Person類中定義了一個類成員(域)name,型別為String,
但Scala會預設幫我們生成name()與name_=()及建構函式Person()。
其中name()對應Java中的getter方法,name_=()對應java中的setter方法
p.name="jack"與p.name_=("jack")一樣的,是統一訪問原則。


 2、 //@BeanProperty用於生成getXxx,setXxx方法   @BeanProperty var name:String="john"
  如果類的成員域定義為val型別的變數,則只會生成getter方法,val變數對應的是java中的final型別變數
  如果將成員域定義為private[this],則不會生成getter、setter方法  private[this] var name:String="john"
3、類主構造器
(1)//下列程式碼不但定義了一個類Person,還定義了主構造器,主構造器的引數為String、Int型別
class Person(val name:String,val age:Int)
/具體使用操作如下:
scala> val p=new Person("john",29)


(2)主構造器會執行類定義中的所有語句,例如
//當在建立物件時,需要進行相關初始化操作時,可以將初始化語句放在類體中,同樣也可以在類中新增或重寫相關方法
class Person(val name:String,val age:Int){
  //println將作為主構建器中的一部分,在建立物件時被執行
  println("constructing Person ........")
  //重寫toString()方法
  override def toString()= name + ":"+ age
}


(3)當主構造器的引數不用var或val修飾的時候,引數會生成類的私有val成員,並且不會產生getter和setter方法
class Person(name:String,age:Int){
  println("constructing Person ........")
  override def toString()= name + ":"+ age
}
//與下面類定義等同
class Person(private[this] val name:String,private[this] val age:Int){
  println("constructing Person ........")
  override def toString()= name + ":"+ age
}


(4)//在定義輔助建構函式時,需要注意建構函式的順序
//輔助構造器,兩者順序不能顛倒。
  def this(name:String){
    this()
    this.name=name
  }
  def this(name:String,age:Int){
    this(name)
    this.age=age
  }


4、其實伴生物件與伴生類本質上是不同的兩個類,只不過伴生類與伴生物件之間可以相互訪問到對主的成員包括私有的成員變數或方法


5、在java語言中,protected成員不但可以被該類及其子類訪問,也可以被同一個包中的其它類使用,但在scala中,protected成員只能被該類及其子類訪問
private[this],限定只有該類的物件才能訪問,稱這種成員為物件私有成員
private,定義的類及伴生物件可以訪問