1. 程式人生 > >大資料之scala(二) --- 對映,元組,簡單類,內部類,物件Object,Idea中安裝scala外掛,trait特質[介面],包和包的匯入

大資料之scala(二) --- 對映,元組,簡單類,內部類,物件Object,Idea中安裝scala外掛,trait特質[介面],包和包的匯入

一、對映<Map>
-----------------------------------------------------
    1.建立一個不可變的對映Map<k,v>  ==>  Map(k -> v)
        scala> val map = Map("tom" -> 1 , "tomasLee" -> 2 , "join" -> 3)
        map: scala.collection.immutable.Map[String,Int] = Map(tom -> 1, tomasLee -> 2, join -> 3)
        注意,這種方式建立的對映的元素是不可以改變的

    2.訪問Map
        scala> map("tom")

    3.建立可變的對映
        scala> val map = scala.collection.mutable.Map(100 -> "tom",200->"tomsLee",300 -> "join")
        map: scala.collection.mutable.Map[Int,String] = Map(200 -> tomsLee, 100 -> tom, 300 -> join)

        scala> map(100) = "222"
        scala> map
        res1: scala.collection.mutable.Map[Int,String] = Map(200 -> tomsLee, 100 -> 222, 300 -> join)

    4.建立空的可變對映:如果想從一個空對映開始,你需要選擇一個對映實現hashmap和map的引數[Int,String]
        scala> val map = new scala.collection.mutable.HashMap[Int,String]
        map: scala.collection.mutable.HashMap[Int,String] = Map()

        scala> map
        res2: scala.collection.mutable.HashMap[Int,String] = Map()

        scala> map(100)="111"

        scala> map
        res4: scala.collection.mutable.HashMap[Int,String] = Map(100 -> 111)

    5.追加和移除元素
        a.對於可變對映
            scala> val map = scala.collection.mutable.HashMap[Int,String]()
            map: scala.collection.mutable.HashMap[Int,String] = Map()

            //新增元素
            scala> map += (1->"100",2->"200")
            res5: map.type = Map(2 -> 200, 1 -> 100)

            //移除元素
            scala> map -= 2
            res9: map.type = Map(1 -> 100)

        b.對於不可變對映
            不可變對映是不能新增和移除元素的,但是可以變成另外一個對映
            scala> val map = Map("tom" -> 1 , "tomasLee" -> 2 , "join" -> 3)
            map: scala.collection.immutable.Map[String,Int] = Map(tom -> 1, tomasLee -> 2, join -> 3)

            //immutable不可變集合新增元素是錯誤的
            scala> map +=("xiao" -> 4)
            <console>:12: error: value += is not a member of scala.collection.immutable.Map[String,Int]
                   map +=("xiao" -> 4)

            //但是可以將map元素新增或者移除一個元素,之後重新賦值給一個新的不可變對映
            scala> val map1 = map + ("xiao" -> 4)
            map1: scala.collection.immutable.Map[String,Int] = Map(tom -> 1, tomasLee -> 2, join -> 3, xiao -> 4)

            scala> map - "tom"
            res15: scala.collection.immutable.Map[String,Int] = Map(tomasLee -> 2, join -> 3)

            scala> map
            res17: scala.collection.immutable.Map[String,Int] = Map(tom -> 1, tomasLee -> 2, join -> 3)

    6.迭代
        scala> for((k,v) <- map) println(k + ":" + v)
        tom:1
        tomasLee:2
        join:3

        //得到一個類似Set("tom", "tomasLee", "join")
        scala> map.keys
        res19: Iterable[String] = Set(tom, tomasLee, join)

        scala> map.keySet
        res20: scala.collection.immutable.Set[String] = Set(tom, tomasLee, join)

        //遍歷values
        scala> for(v <- map.values) println(v)
        1
        2
        3

        //遍歷keys
        scala> for(v <- map.keys) println(v)
        tom
        tomasLee
        join

        //遍歷keySet
        scala> for(v <- map.keySet) println(v)
        tom
        tomasLee
        join

        //遍歷values
        scala> for(v <- map.keySet) println(map(v))
        1
        2
        3

    7.yield 迭代產生新的對映,比如kv調換
        scala> map
        res12: scala.collection.mutable.HashMap[Int,String] = Map(1 -> 100)

        scala> for((k,v)<- map ) yield(v,k)
        res11: scala.collection.mutable.HashMap[String,Int] = Map(100 -> 1)


二、元組tuple
-------------------------------------------------------------------
    1.元組是不同型別的值的聚集 -- 對映是鍵值對的集合,鍵值對是元組的最簡單的形式

    2.元組的值是通過將單個的值包含在圓括號中構成的
        (1,3.14,"Fred")

    3.定義一個元組Tuple,最多22個元素
        scala> val t = (1,3.14,"Fred")
        t: (Int, Double, String) = (1,3.14,Fred)

    4.訪問元組中的元素
        scala> t._1
        res27: Int = 1

        scala> t _2
        res28: Double = 3.14

        scala> t._3
        res29: String = Fred

    5.直接取出元組中的所有元素
        scala> val(a,b,c) = t
        a: Int = 1
        b: Double = 3.14
        c: String = Fred

    6.陣列的zip(咬合/拉鍊)
        scala> val h = Array(1,2,3)
        h: Array[Int] = Array(1, 2, 3)

        scala> val w = Array(4,5,6)
        w: Array[Int] = Array(4, 5, 6)

        scala> h.zip(w)
        res31: Array[(Int, Int)] = Array((1,4), (2,5), (3,6))


三、簡單類
-----------------------------------------------------
    1.定義類
        class Person{

            //定義變數,私有型別,必須初始化
            //set/get也私有
            private var id = 0 ;

            //不宣告就是public,public的常量自帶get,沒有set
            val age = 100 ;

            //不宣告就是public,public的變數自帶get,set
            var name = "tom" ;

            //預設public
            def incre(a:Int) = {id += a ;}

            //如果定義函式時,沒有加(),呼叫就不能加()
            def current() = id

        }

    2.使用類
        scala> var p = new Person()
        p: Person = Pers
[email protected]
//宣告方法的時候帶(),呼叫方法的時候可以帶也可以不帶 scala> p.current res0: Int = 0 scala> p.incre(2) scala> p.current() res2: Int = 2 //呼叫get方法。注意p.name(),說錯誤的,不能加括號,因為定義的時候沒有括號 scala> p.name res5: String = tom //呼叫set方法賦值,要加括號 scala> p.name_=("jarry") scala> p.name res9: String = jarry //直接給公有的變數賦值 scala> p.name = "kkk" p.name: String = kkk 3.private[this] 私有修飾 -- 物件私有化 private var value = 0; //其他物件可以通過一些手段訪問 private[this] var value = 0; //只能在自己物件中訪問
[email protected]
註解 當你將scala欄位添加註解@BeanProperty的時候,自動生成javabean對應的setName() 和 getName()方法 class Person{ // _ 表示預設值[Unit] @scala.reflect.BeanProperty var name:String = _ } 5.建構函式 a.scala建構函式分為主構造器和輔助構造器 b.輔助構造器 輔助構造器的名稱都叫this 每一個輔助構造器都必須先呼叫,先前已經定義的其他輔助構造器或者主構造器 class Person{ var name = ""; var age = 0; def this(name:String) { this(); //呼叫主構造器this() this.name = name; } def this(name:String , age:Int) { this(name); //呼叫輔助構造器this(name) this.age = age; } } scala> var p = new Person("tom", 12); p: Person =
[email protected]
scala> p.name res13: String = tom scala> p.age res14: Int = 12 c.主構造器 : 直接放置在類名之後 class Person(var name:String, var age:Int){ //因為主構造器的引數會被編譯成欄位,所以下面程式碼可省略 //var name = ""; //var age = 0; //def this(name:String , age:Int) { // this(name); //呼叫輔助構造器this(name) // this.age = age; //} //下面這些語句是在建構函式中,也就是說,每次建立物件都會呼叫一次 println("xxxxxx"); println("xxxxxx"); println("xxxxxx"); age += 100; def hello() = {println("hello" + age);} } 四、巢狀類 -- 內部類 ------------------------------------------------------------- 1.對於scala,你可以在類中定義類,可以在方法中定義方法 class Person{ class Heart(val count : Int){ println("*****") } var name = "tom"; def fun(arg : String) = { def fun1() { } def fun2() { } } } 2.new Person().new Heart(80); 五、物件Object ------------------------------------------------------------ 1.單例物件 a.scala中沒有靜態方法和靜態欄位,靠單例物件來實現 object Util{ var name = "tom"; def hello() = {println("hello")}; } b.scala> Util.name res3: String = tom scala> Util.hello hello scala> Util.name = "ccc" Util.name: String = ccc 2.類和類的伴生物件(類中的某個成員是靜態的) a.類和它的伴生物件可以互相訪問私有成員 -- 但是,class和object必須在同一個檔案中 class Account{ var id = Account.uniqueNumber(); ... } object Account{ private def uniqueNumber() = { return 0 }; } 3.擴充套件[繼承]類和特質[介面]的物件 a.scala中的抽象類 abstract class UndoAction (val description : String ){ def undo():Unit def redo():Unit } b.scala中的繼承 //類的繼承 class DoNothingAction extends UndoAction ("Do nothing"){ override def undo(){} override def redo(){} } //DoNothingAction這個物件(靜態物件)可以被所有需要預設行為物件的地方共有(需要do nothing就呼叫) object DoNothingAction extends UndoAction ("Do nothing"){ override def undo(){} override def redo(){} } 4.apply方法 a.Object(引數1,....,引數N) 這樣一個apply方法,返回的是伴生類的物件,比如Array("aaa","bbb","ccc")返回的是一個String的陣列; b.Array(100) 和 new Array(100)的 區別 Array(100),返回的是一個只包含一個元素100的陣列。100表示元素 new Array(100),返回的是一個有100個元素,每個元素都為空的陣列。100表示陣列中元素的個數 scala> Array(100) res1: Array[Int] = Array(100) scala> new Array(100) res2: Array[Nothing] = Array(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null) c.自定義Apply方法--示例 object Hello { def apply(s:String) = {println(s)}; } scala> Hello("hello") hello scala> Hello("hai") hai scala> Hello.apply("hai") hai d.應用程式物件 -- 帶main函式的object[因為main函式是靜態的,所以只能在物件中] object Hello { def main(args : Array[String]) = { println("xxx"); } } scala> Hello.main(Array()) xxx 六、Idea中安裝scala外掛 ------------------------------------------------------------- 1.開啟idea --> File --> settings --> plugins --> install xxx --> --> 找到scala-intellij-bin for xxx.zip 或者使用網上下載安裝方式進行安裝 2驗證安裝是否成功 a.建立scala模組,選擇sdk,新增maven支援 b.編寫object object Hello { def main(args: Array[String]): Unit = { println("Hello world"); } } c.執行object 七、trait特質[介面] ----------------------------------------------------------- 1.建立trait trait Hello{ } 2.編譯scalac cmd:D:\share\scala\workspace> scalac trait-1.scala 3.反編譯 cmd> javap Hello.class public interface Hello { } 八、包和包的匯入 ----------------------------------------------------------- 1.包物件 //編譯包物件,編譯完之後生成以xxx為package,下面含有類package.class + package.class // .../a/aa/aaa/people/package.class // .../a/aa/aaa/people/package$.class package a.aa.aaa; package object people { var name = "hello"; } 2.包的可見性約束 package a.aa.aaa; class Person{ //在package包及其子包中可見 private[people] def func() = { println("xxx")} //在aaa包及子包中可見 private[aaa] def func1() = {println("---")} } 3.包的匯入 a._表示通配 import java.awt.Color._ b.選取器selector //只引入包中的幾個成員類 import java.awt.{Color,Font} c.選取器重新命名,別名 比如 HashMap 在 java.util 和 scala.collection中都有。如果想同時匯入兩者,那麼就必須將其中一個HashMap指定別名 否則就不知道hashMap指向的是哪個包了 import java.util.{HashMap => JavaHashMap} import scala.collection.mutable.HashMap d.隱藏匯入成員 //將java包中的HashMap隱藏掉,不使用 import java.util.{HashMap => _} import scala.collection.mutable.HashMap