好程式設計師大資料學習路線分享spark之Scala

好程式設計師IT發表於2019-08-16

好程式設計師大資料學習路線分享 spark Scala ,基本語法:

變數

變數的定義:不可變: val a = 2   或者  val a : Int = 2 ( 指定了資料型別 )  lazy val a : Int =2

可變: var a = 2    或者  var a : Int = 2( 指定了資料型別 )

def  a = 2

定義變數不能 1. 以數字以及特殊符號( _ 除外)開頭  2. 以關鍵字( var val class 等)開頭

def 定義的是??

var  編譯後有 set  與  get     所以可以重新賦值

val  編譯後只有 get 方法  所以不能再賦值了

lazy  惰性變數 , 只在該變數被呼叫的時候才例項化,而且後面只能跟 val

def  val  差不多 不能重新賦值  更多修飾方法

Scala 變數的型別: Any scala 的頂級型別, Any 下有 AnyVal (值型別)和 AnyRef (引用型別)兩個子類

AnyVal :  它有 9 個型別,其中 7 個是指型別: Double  Float  Byte  Int  Short  Long  Char  和兩個非值型別: Unit  Boolean

AnyRef :  是引用型別,它的子類有: List  Option  或者自定義的並繼承它的 class

所有的型別都需要首字母大寫

Scala 會自動推斷型別

Scala 資料型別可以從低到高轉換  Byte-Short-Int-Long-Float-Double

  Char-Int-Long-Float-Double

注意: scala 內沒有強轉

運算子

Scala 裡沒有運算子的概念,所謂的運算子其實都是方法

數學運算: + - * / : % .+ ( )    注: x+y  與  x.+(y) 等價

關係: <  <=  >  >=  !  !=  ==

位運算:  | & ^

如果兩個不一樣型別的變數進行運算,最終結果的型別是大的那個型別

如果想要格式化輸出: var x =5   var y = 5

var n =x + y

    print(s”x+y=$n”)    輸出結果  x+y=10

當然也可以在結果前面加字串”x+y”

 

條件表示式


這種打出來是空,因為else 裡不是一個值,而是一個賦值語句

正常應該是  var res = if(sex == 1){“男”}else{“女”}

因為大括號裡只有一個 ‘表示式’,大括號可以省略

var res = if(sex == 1)“男”else“女”

 

f or 迴圈

for(i<- 1 to 10){println (i)}   // 列印 1-10

          for(i <- 1 until 10){println (i)} // 列印 1-9

val arr = Array(“java”,”scala”,”python”) // 定義一個陣列

for(i<- arr){println (i)}     // 列印陣列內容

        for(i <- 1 to 3 ;j <- 1 to 3 if(i != j)){println(i*10+j)} // 相當於雙層 for 迴圈

  val arr =for(i <- 1 until 10) yield (i) // 0-9 迴圈出來後封裝進 arr 集合

  val arr =for(i <- 1 until 10) yield (i*10)

  val res2 = for(i <- arr if i%2 == 0) yield i*100   // 過濾

val arrf = bf.filter(_ %2==0).map(_ *100)  // 過濾   是全部資料的意思  

 

  

scala 中不支援 break 語句,但在 scala 2.8 之後 可以利用 Breaks 方式來實現


方法

def  m1(x : Int , y : Int ) : Int = {x + y} // 三種宣告方式

def m2(x:Int , y:Int) {print(x+y)}

def m3(x:Int , y:Int){x+y}

解釋: m1 是方法名   xy int 型的引數  括號外的 int 是返回值型別   x+y 是方法

呼叫: m1 (3,4)

函式

val f1 = (x:Int , y:Int) => x+y // 宣告

val f1 = (x:Int , y:Int) =>{

val sum = x+y

 sum*100} // 最後一句作為函式的返回值   函式沒有返回值型別

回車之後會看到

f1: (Int, Int) => Int = <function2>

這裡的 function2 中的 2 指的是引數的個數

呼叫: f1 (3,4) // 與方法的呼叫一致

函式與方法的關係 ???

我們透過一個案例來探討:

首先建立一個方法: def func (yAge:Int,mAge:Int):String={

  val a : Boolean = yAge >= mAge

  val str : String = if(a) " 哥哥 " else " 弟弟 "

  str

}

我們發現這個條件可以做成一個函式: val m = ( yAge:Int , mAge:Int ) = >{yAge >= mAge}

我們可以呼叫函式: def func1 (yAge:Int,mAge:Int):String={

  val a : Boolean = m(yAge,mAge)

  val str : String = if(a) " 哥哥 " else " 弟弟 "

}

我們也可以把函式當做一個引數傳入到方法中:

 def func1(yAge:Int,mAge:Int,f:(Int,Int) =>Boolean):String={

    var a= f(yAge,mAge)   或者 var a :Boolean = f(yAge,mAge)

    val res : String=if(a)" 哥哥 " else " 弟弟 "

  res

}

呼叫:  println(func1(18,20,m))


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2653923/,如需轉載,請註明出處,否則將追究法律責任。

相關文章