您好,登錄后才能下訂單哦!
好程序員大數(shù)據(jù)學(xué)習(xí)路線分享spark之Scala,基本語法:
變量
變量的定義:不可變:val a = 2 ?或者?val a : Int = 2 (指定了數(shù)據(jù)類型) ?lazy val a : Int =2
可變:var a = 2 ??或者?var a : Int = 2(指定了數(shù)據(jù)類型)
def ?a = 2
定義變量不能1.以數(shù)字以及特殊符號(_除外)開頭?2.以關(guān)鍵字(var、val、class等)開頭
def定義的是??
var?編譯后有set?與?get?方?法??所以可以重新賦值
val?編譯后只有get方法 ?所以不能再賦值了
lazy?惰性變量,只在該變量被調(diào)用的時候才實(shí)例化,而且后面只能跟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數(shù)據(jù)類型可以從低到高轉(zhuǎn)換?Byte-Short-Int-Long-Float-Double
??Char-Int-Long-Float-Double
注意:scala內(nèi)沒有強(qiáng)轉(zhuǎn)
操作符
Scala里沒有操作符的概念,所謂的操作符其實(shí)都是方法
數(shù)學(xué)運(yùn)算:+ - * / : % .+ ( ) ??注:x+y?與?x.+(y)等價
關(guān)系:< ?<= ?> ?>= ?! ?!= ?==
位運(yùn)算:?| & ^
如果兩個不一樣類型的變量進(jìn)行運(yùn)算,最終結(jié)果的類型是大的那個類型
如果想要格式化輸出:var x =5 ??var y = 5
var n =x + y
????print(s”x+y=$n”) ??輸出結(jié)果?x+y=10
當(dāng)然也可以在結(jié)果前面加字符串”x+y”
?
條件表達(dá)式
這種打出來是空,因?yàn)閑lse里不是一個值,而是一個賦值語句
正常應(yīng)該是?var res = if(sex == 1){“男”}else{“女”}
因?yàn)榇罄ㄌ柪镏挥幸粋€‘表達(dá)式’,大括號可以省略
var res = if(sex == 1)“男”else“女”
?
for循環(huán)
for(i<-?1 to 10){println (i)} ? //打印1-10
??????????for(i <-?1 until 10){println (i)} //打印1-9
val arr = Array(“java”,”scala”,”python”) //定義一個數(shù)組
for(i<-?arr){println (i)} ????//打印數(shù)組內(nèi)容
? ??????for(i <-?1 to 3 ;j <-?1 to 3 if(i != j)){println(i*10+j)} //相當(dāng)于雙層for循環(huán)
??val arr =for(i <- 1 until 10) yield (i) //把0-9循環(huán)出來后封裝進(jìn)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) ?//過濾 ?_?是全部數(shù)據(jù)的意思 ?
?
??
在scala中不支持break語句,但在scala 2.8之后 可以利用Breaks方式來實(shí)現(xiàn)
方法
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型的參數(shù) ?括號外的int是返回值類型 ?x+y是方法
調(diào)用:m1 (3,4)
函數(shù)
val f1 = (x:Int , y:Int) => x+y //聲明
val f1 = (x:Int , y:Int) =>{
val sum = x+y
?sum*100} //最后一句作為函數(shù)的返回值 ??函數(shù)沒有返回值類型
回車之后會看到
f1: (Int, Int) => Int = <function2>
這里的function2中的2指的是參數(shù)的個數(shù)
調(diào)用:f1 (3,4) //與方法的調(diào)用一致
函數(shù)與方法的關(guān)系???
我們通過一個案例來探討:
首先創(chuàng)建一個方法:def func (yAge:Int,mAge:Int):String={
??val a : Boolean = yAge >= mAge
??val str : String = if(a) "哥哥" else "弟弟"
??str
}
我們發(fā)現(xiàn)這個條件可以做成一個函數(shù):val m = ( yAge:Int , mAge:Int ) = >{yAge >= mAge}
我們可以調(diào)用函數(shù):def func1 (yAge:Int,mAge:Int):String={
??val a : Boolean = m(yAge,mAge)
??val str : String = if(a) "哥哥" else "弟弟"
}
我們也可以把函數(shù)當(dāng)做一個參數(shù)傳入到方法中:
?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
}
調(diào)用:?println(func1(18,20,m))
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。