package learn.scalaimport org.apache.spark.SparkConf//scala中 object 與 class的區別object Scala1 { def main(args: Array[String]): Unit = { //1. 定義變量 //沒有指定msg的類型,那么Scala會自動根據 "Hello,World!"的類型來推斷 msg的類型 val msg="Hello,World!" PRintln(msg); //指定類型 val msg2:String="Hello,World!" val msg3:java.lang.String="Hello,World!" println(msg3); //val類型不能重新賦值 //scala> msg2 = "Goodbye cruel world!" //<console>:5: error: reassignment to val // msg2 = "Goodbye cruel world!" var greeting="Hello,World!" greeting="Leave me alone,world!" println(greeting); //println(1+2); //val acc=new Scala2 //acc.add(12) //println(acc.checksum()) //println(f()); //輸出結果為 () //println(g()); //輸出結果為 () //println(h()); //輸出結果為 this string gets lost //println(max(1,2)) //println(max2(23,3)) //println(greet) //println(greet2) //3. 循環 // while循環,if判斷 var i=0 while(i<10){ println(i) i+=1 } //i++ ++i 在scala中是無效的 // foreach,for var str:Array[String]=new Array[String](10); //------foreach方法給() 或者{} 都可以 Array[String]("concise","is","nice").foreach(arg=>println(arg)) //------arg如果要指定類型的話,要加上小括號() Array[String]("concise","is","nice").foreach((arg:String)=>println(arg)) Array[String]("concise","is","ncie").foreach(println); //------arg是val類型,而不是var類型,arg不能再for表達式的函數體中重新賦值 for(arg<-Array[String]("concise","is","ncie")) println(arg) //4. 帶類型的參數化數組 val greetStrings=new Array[String](3) //-----當你在一個或多個值或變量外使用括號時,Scala會把它轉換成對名為apply的方法調用.于是greetStrings(i)轉換成 //-----greetStrings.apply(i)。所以Scala里訪問數據的元素也不過只是跟其它的一樣的方法調用 //這個原則不僅僅局限于數組:任何對某些在括號中的參數的對象的應用將都被轉換為對apply方法的調用.當前前提是這個類型實際定義過 //apply方法。所以這不是一個特例,而是一個通則 greetStrings(0)="Hello" //java是[0] greetStrings(1)="," greetStrings(2)="world" //-----0 to 2 實際上調用的是(0).to(2) for(i<-0 to 2) //0 1 2 print(greetStrings(i)) var numName=Array("1","2","3"); val numName2=Array.apply("1","2","3","4"); for(i<- 0 to 2){ println(numName(i)) } for(i <- 0 to 3){ println(numName2(i)) } //5. 使用List val oneTwoThree=List(1,2,3) //---scala中List是不可變的,表現上有些像Java的String:當你在一個List上調用方法時,似乎這個名字指代的List看上去被改變了,而實際上 //---它只是用新的值創建了一個List并返回。 val oneTwo=List(1,2) val threeFour=List(3,4) val oneTwoThreeFour=oneTwo ::: threeFour println(oneTwo+" and "+ threeFour+"were not mutated.") println("Thus, "+oneTwoThreeFour+" is a new List.") //-- :: 把一個新元素組合到已有List的最前端,然后返回結果List val twoThree=List(2,3) //執行過程為 twoThree.::(1) val tmp=1 :: twoThree println(tmp) val tmp2=1::2::3::4::Nil //Nil要最后才能使用 ::被定義在List類上的方法,如果使用1::2::3 由于3是Int類型的,沒有::方法,因此會導致異常 println(tmp2) //為什么List不支持append ? //類List沒有提供append操作,因為隨著列表邊長append的耗時將呈線性增長,而使用::做前綴則僅花費常量時間.如果你想通過添加元素來構造列表 //你的選擇時把它們前綴進去,當前完成之后再調用reverse;或使用ListBuffer,一種提供append操作的可變列表,當你完成之后再調用toList //目前元組的最大長度支持到 22 var pair=(1,2,"a","b"); println(pair._1) println(pair._2) println(pair._3) println(pair._4) //7. 使用Set和Map var jetSet=Set("Boeing","Airbus") jetSet+="Lear" //對不可變集 使用+=需要重新賦值,所以是var的 println(jetSet.contains("Lear")) import scala.collection.mutable.Set //引用了可變 Set val movieSet=Set("Hitch","Poltergeist") movieSet+="Shrek" //是可變的不需要對 movieSet重新賦值,所以他是val的 println(movieSet); import scala.collection.immutable.HashSet val hashSet=HashSet("Tomatoes","Chilies") println(hashSet+"Coriander") //Map是Scala里另一種有用的集合類,和Set一樣,Scala采用了類繼承機制提供了可變的和不可變的兩種版本的Map //scala.collection包里面有一個基礎的Map特質和兩個子特質Map //可變的Map在scala.collection.mutable里,不可變的在scala.collection.immutable里 import scala.collection.mutable.Map val treasureMap=Map[Int,String]() // -> 可以調用Scala程序里的任何對象,并返回一個包含鍵和值的二元組 treasureMap+=(1->"Go to island.") treasureMap+=(2->"Find big X on ground.") treasureMap+=(3->"Dig.") println(treasureMap(2)) } //2. 定義函數 def max(x:Int,y:Int):Int={ if(x>y){ x }else{ y } } def max2(x:Int,y:Int)=if(x>y)x else y def greet()="h" // println(greet) 輸出結果為 h def greet2()=println("h") // println(greet2) 輸出結果為 h () 是因為該方法是沒有返回值的 //需要注意的地方: def f():Unit="this string gets lost" def g(){"this string gets lost"} def h()={"this string gets lost"} def name(): Unit = { } //分號推斷 }class Scala2 { //默認就是 public 級別 private var sum = 1; //傳遞給方法的任何參數都可以在方法內部使用,Scala里方法參數的一個重要特征是它們都是val 不是var //def add(b:Byte):Unit={ // sum+=b; //} def add(b:Byte):Unit=sum+=b; //如果沒有發現任何顯式的返回語句,Scala方法將返回方法中最后一個計算得到的值 //def checksum():Int={ // return ~(sum & 0xff)+1 //} //= ~ 之間要有空格,否則編譯報錯(認為=~是一個整體) def checksum():Int= ~(sum & 0xff)+1 }
新聞熱點
疑難解答