Scala简介
1.Scala源自Java
(1)Scala构建在JVM之上
(2)Scala与Java兼容、互通
2.Scala的优势
(1)多范式编程:面向对象编程、函数式编程
(2)表达能力强,代码精简
3.大数据与Scala
Spark采用Scala语言设计
(1)提供的API更加优雅
(2)基于JVM的语言,能融入Hadoop生态圈
4.Scala特点
(1)静态类型:
Scala 的变量声明后不允许改变类型
(2)强类型:
Scala 是强类型语言,Scala 在声明变量时一般无需显示指定类型,Scala 编译器会自动推断出类型。
Scala 没有提供 Java 中的强制类型转换,取代方法有:
①对象名:.asInstanceOf[XXX]
②对象名:.toXXX 方法
③隐式转换:implicit 关键字
(3)面向对象编程(OOP)
①Scala 中一切值都是对象
②对象的数据类型和行为由类(Class)和特质(Trait,类似于接口)描述
③利用特质实现混入式多重继承
(4)函数式编程(FP)
①Scala 中一切函数都是值,所以可以将函数作为参数和返回值。
②支持高阶函数、柯里化(currying)、样例类(case class)及模式匹配……
Scala关键字
1.Scala关键字列表
2.Scala和java关键字对比
Scala变量与常量
1.定义(一般无需显示指定类型,Scala编译器会自动推断出类型)
(1)变量:
赋值后可以改变,生命周期中可以被多次赋值
scala> var name = "jason"
name:String = jason
(2)常量
赋值后不可变,类似于Java中的final变量
scala> var money = 100
name:Int = 100
(3)使用类型别名定义变量
type关键字
scala> type T = String
defined type alias T
scala> val name:T = "jason"
name:T = jason
(4)类型推断
使用类型推断是必须指定变量初始值,否则无法进行类型推断。
var a //错误定义方式
var a=1 //正确定义方式
var a:Int //错误定义方式
如果不想赋初值可以使用下划线“_”。
var a:Int=_ //正确定义方式
val a:Int=_ //错误定义方式,因为 val 定义为常量
Scala数据类型
1.Scala与Java有着类似的原始数据类型
(1)Byte:8位有符号整数。数值区间-128 ~ 127
(2)Short:16位有符号整数。数值区间-32768 ~ 32767
(3)Int:32位有符号整数。数值区间 -2147483648 ~ 2147483647
(4)Long:64位有符号整数。 -9223372036854775808 ~ 9223372036854775807
(5)Float:32位IEEE 754 单精度浮点数
(6)Double:64位IEEE 754 双精度浮点数
(7)Char:16位无符号Unicode字符。区间值为U+0000 ~ U+FFFF
(8)Boolean:true或false
(9)String:等于java.lang.String
2.Scala数据类型层次结构
(1)Any:所有类型的超类(顶级类型)
(2)AnyVal:表示值类型的超类
(3)AnyRef:表示引用类型的超类,对应java.lang.Object
(4)Unit:Unit 代表没有任何意义的值类型,他是 AnyVal 的子类型,仅有一个实例对象“()”,叫做无用占位符,类似于 Java 中的 void 类型。Uint有返回值()
(5)Nothing:所有类型的子类,也是 Null 的子类,含义便是“啥都没有”,所以没有任何实例
(6)Null:scala.Null 是所有引用类型的子类,仅一个实例对象“null”,并且“null”是关键字,但在 Java 中 null 不是对象
3.值类型与引用类型的区别
(1)值类型:直接存储值,在栈上存储其值。
(2)引用类型:存储对其值的引用,在栈上存储地址,在堆上存储值
在 Scala 中两个对象进行“==”操作,是比较值是否相等,而非地址,与 Java刚好相反
(3)区别:
case class Po(id:Int) //使用了后面的内容,理解为 POJO 对象即可
val p1=Po(1)
val p2=Po(1)
p1==p2 //true 比较值
p1.eq(p2) //false 比较地址
4.Scala字符串插值
1.s插值器:允许将变量引用、表达式直接插入字面字符中
val name="James"
println(s"Hello,$name") //Hello,James
println(s"1+1=${1+1}") //1+1=2
2.f插值器
val height=1.9d
val name="James"
println(f"$name%s is $height%2.2f meters tall")
3.raw插值器
s"a\nb" //将输出换行符
raw"a\nb" //输出原始字符
Scala程序控制
1.条件控制
默认情况下,scala 不需要语句终结符“;”,默认将每一行作为一个语句。如果语句块只有一行语句,省略“{}”即可。
(1)if语句
val x=10
if(x>0){
print("x大于0")
}
(2)if…else语句
①
val x=10
if(x>10){
print("x大于10")
}else{
print("x小于等于10")
}
②
val x=10
if(x>10){
print("x大于10")
}else if(x==10){
print("x等于10")
}else{
print("x小于10")}
(3)条件语句返回值
①Scala任何表达式都有返回值
val x=10
val y=if(x==10) x+1 else x //单行表达式可以省略{}
//y=11
②代码块“{…}”也是表达式,返回值为最后一个表达式结果
val x=10
val y={
print("我是代码块")
x+1
}
//y=11
③赋值语句动作没有值,准确来说,赋值语句的值为 Unit 类型,即“()”
val x=