好程序员大数据培训分享spark之Scala

  好程序员大数据培训分享spark之Scala,基本语法:变量,变量的定义:不可变:val a = 2 或者 val a : Int = 2 (指定了数据类型) lazy val a : Int =2
可变:var a = 2 或者 var a : Int = 2r j I m(指定了数据类型)
def a = 2
定义变量不能1.以数字以及特殊符号(_除外)开头 2R ~ | : a.以6 Y 0 m t x ]关键字(var、val、class等)开头
def定义的是z U k??
var 编译后有set 与 get 方☐法 所以可以重新赋值
val 编译后只有getB l -方法 所以不能再赋值了
lazy 惰性变量,只在该变量被调用的时候才实例化,而且后面只能跟val
def 与val 差不多 不能重新赋值 更多修饰方法
Scala变量的类型:Any是scz - y & nala的顶级类型,Any下有AnyVal(值类型)和AnyRef(引用类型)两个子类) 9 ) R R w
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-D. T f e a eouble
注意:scala} c 没有强转
操作符
Scala里没有操作符的概念,所谓的操作符其实都是方法
数学运算:+ -0 S G P W U p * / : % .+ ( ) 注:x+y 与 x.+(y)等价
关系:< <= > >= ! != ==
位运算: | & ^
如果两个不一样类型的变量进行运算,最终结果的类型是大的那个类型
# | N Q ! M #果想要格式化输出:var x =5 var y = 5
vao C kr n =x + y
print(s”: E D ^x+y=$n”) 输出结果 x+y=10
当然也可以在结果前面加字符串”x+y”
条件表达式
这种打出来是空,因为else里不是一个值,而是一个赋值语句
正常应该是 var res = if(sex == 1){“# $ k [ & 7 M H男”}els` 1 p h % 4 N ~e{“女”}
因为大括号里只有一个‘表达式’,大括号可以省略
var res = if(sex == 1)“男”else“女”
for循环
for(i<- 1 to 10){println (i)} //打印1-10
for(i <- 1 until 10){println (i)} //打印1-9
val arr = Array(“java”4 V H $ ? r k,”scala”,”python”) //定义一个数组
for(i<- arr){pr+ 2 g b , ; }intln (i)} //打印数组内容
for(i <- 1 to 3 ;j <; y V 9 v Z;- 1 to 3 if(i != jX F ~ V / 0)). ( p 9{println(i*10+j{ v v P D s n)} //相当于双层for循环
val arr =for(i <- 1 until 10) yie* | W O d v Uld (i) //把0-9循环q U N P Z出来后封装进arr集合
val arr =for(i <- 1 until 10) yi2 $ 1 3 Y Celd (i*10)
val res2 = for(i <- art n t h M T o ur if i%2 ==| , 7 Z 0) yield i*100 //过滤
val arrf =j 4 f z W bf.filter(_ %2==0).map(_ *100) //过滤 _ 是全部数据的意思
scala中不支持break语句,但在scala 2.8之后 可以利用Brec g / 5 * | 7 [aks方式来实f i ? j } n 9 ;
方法
def m1(xB P C v : : Int , y& + ) R ` i j + : Int ) : Int = {x + y} //三种声明方式
def m2(x:Int , y:Int) {print(x+y)}
d4 u aef 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} //最后一句作为函数的返回值 函数没有返回值类型
回车之后会看到
f6 v ; $ = $1: (Int, Int) => Int =
这里的function2中的2指的是参数的个数
调用:f1 (3,4) //与方法的调用一致
函数与方t 5 8 Z n 6法的关系???
我们通过一个案例来探讨:
首先创建一b q K J个方法:def func (yAge:Int,mAgk f [ g z +e:Int):String={
val a : Boolean = yAge >= mAge
val str : String = if(a) "哥哥" else "弟弟"
str
}
我们发e # R S Z i现这个条件可以做成一个函数:val m = ( yAge:Int , mAge:Int ) = >U B T d B * c $ _{yAge >= mAge}
我们可以调用函数:def func1 (yAge:Int,mAge:Int):{ . g ( ] 3 UString={* 4 5 y $ `
val a :@ S ] C C Boolean = m(yAge,mAge)x % / T | ~ w &
val str : String = if(a) "哥哥" else "弟弟"
}
我们也可以把函数当做一个参数传入到方法中:
def func1(yAge:Intk 3 : ( W 0 d N R,mAge:Int,f:(Int,Int) =>BooleaM W F K E M }n):String={
var a= f(yAge,mAge) 或者var a :Boolean = f(yAge,mAge)
vaD x :l res : String=if(a)"哥哥" else "弟弟"
res
}
调用: println(func1(18,20,m))