目 录
一、Scala概述
二、Scala数据类型
三、Scala函数
四、Scala集合
五、Scala伴生对象
六、Scala trait
七、Actor
八、隐式转换与隐式参数
九、Scala JDBC
由于整理的篇幅较长,所以文章计划分三次发布。
一、Scala概述
1. Scala简介
Scala是一种针对JVM将函数和面向对象技术组合在一起的编程语言。所以Scala必须要有JVM才能运行,和Python一样,Scala也是可以面向对象和面向函数的。Scala编程语言近来抓住了很多开发者的眼球。它看起来像是一种纯粹的面向对象编程语言,而又无缝地结合了命令式和函数式的编程风格。Scala的名称表明,它还是一种高度可伸缩的语言。Scala的设计始终贯穿着一个理念:创造一种更好地支持组件的语言。Scala融汇了许多前所未有的特性,而同时又运行于JVM之上。随着开发者对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件必不可少的工具。Spark最最源生支持的语言是Scala。Spark主要支持java、Scala、Python和R。Scala的底层协议是akka(异步消息传递)。
2. Scala安装与开发工具
Scala版本使用Scala-2.10.x。
JDK使用jdk-1.8。
开发工具使用Intellij IDEA-2017.3.5。
二、Scala数据类型
1. 数据类型
scala拥有和java一样的数据类型,和java的数据类型的内存布局完全一致,精度也完全一致。其中比较特殊的类型有Unit,表示没有返回值;Nothing表示没有值,是所有类型的子类型,创建一个类就一定有一个子类是Nothing;Any是所有类型的超类;AnyRef是所有引用类型的超类;注意最大的类是Object。
上表中列出的数据类型都是对象,也就是说scala没有java中的原生类型。在scala是可以对数字等基础类型调用方法的。例如数字1可以调方法,使用1.方法名。
如上两图所示,可见所有类型的基类与Any。Any之后分为两个AnyVal与AnyRef。其中AnyVal是所有数值类型的父类型,AnyRef是所有引用类型的父类型。
与其他语言稍微有点不同的是,Scala还定义了底类型。其中Null类型是所有引用类型的底类型,及所有AnyRef的类型的空值都是Null;而Nothing是所有类型的底类型,对应Any类型;Null与Nothing都表示空。
在基础类型中只有String是继承自AnyRef的,与Java,Scala中的String也是内存不可变对象,这就意味着,所有的字符串操作都会产生新的字符串。其他的基础类型如Int等都是Scala包装的类型,例如Int类型对应的是Scala.Int只是Scala包会被每个源文件自动引用。
标准类库中的Option类型用样例类来表示拿着可能存在、也可能不存在的值。样例子类Some包装了某个值,例如:Some(“Fred”);而样例对象None表示没有值;这比使用空字符串的意图更加清晰,比使用null来表示缺少某值的做法更加安全(避免了空指针异常)。
2. 声明与定义
字段/变量的定义Scala中使用var/val 变量/不变量名称: 类型的方式进行定义,例如
var index1 : Int= 1 val index2 : Int= 1
在Scala中声明变量也可以不声明变量的类型。
- 常量的声明 val
使用val来声明一个常量。与java一样,常量一次赋值不可修改。
val name : String="Yang"//这是完整的写法,可以省略类型,如下所示: val name="Yang"
name="Yang2"//会报错reassignment to val
- 变量的声明 var
var name : String = "Yang" //这是完整的写法,可以省略类型,如下所示: //var name = "Yang" //变量或常量声明时,类型可以省略,Scala内部机制会推断。 name = "Yang2"//变量的值可以修改
- 函数的声明 def
使用def关键字来声明函数。例如:
object HelloScala { def main(args: Array[String]): Unit = { println(f) } val a=1 var b=2 def f=a*b }
def f=a*b;//只是定义a*b表达式的名字,并不求值,在使用的时候求值。这里Scala已经推断出了f函数的返回值类型了,因为a和b都是Int,所以f也是Int。从控制台可以看出这个效果:
def f=a*b//如果写成val f,这时会直接算出结果。这是定义函数和定义常量的区别。
3. 字符串
- 注释
单行注释://
- 单行字符串
同Java
- 多行字符串/多行注释
scala中还有类似于python的多行字符串表示方式(三个单引号),用三个双引号表示分隔符,如下:
val strs=”””
多行字符串的第一行 多行字符串的第二行 多行字符串的第三行”””
- S字符串
S字符串,可以往字符串中传变量。