大資料之scala(二) --- 對映,元組,簡單類,內部類,物件Object,Idea中安裝scala外掛,trait特質[介面],包和包的匯入
阿新 • • 發佈:2018-11-09
一、對映<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