一、什么是Scala
1、Scala特点
- Scala是一种将面向对象和函数式编程结合在一起的高级语言,旨在以简洁、优雅和类型安全的方式表达通用编程模式。Scala功能强大,不仅可以编写简单脚本,还可以构建大型系统。
2、Scala与java关系
- Scala运行于Java平台,Scala程序会通过JVM被编译成class字节码文件,然后在操作系统上运行。其运行时候的性能通常与Jva程序不分上下,并且Scala代码可以调用Java方法、继承Java类、实现Java接口等,几乎所有Scala代码都大量使用了Java类库。
3、Scala与Spark
- 由于Spark主要是由Scala语言编写的,为了后续更好的学习Spark以及使用Scala编写Spark应用程序,需要首先学习使用Scala语言。
二、安装Scala
版本要求:
由于Scala运行于Java平台,因此安装Scala之前需要确保系统安装了JDK。此使用的Scala版本为2.12.7,要求JDK版本为1.8。
(一)、Windows安装
1. 下载Scala
到Scala官网https:/www.scala-lang.org/download/下载Windows安装包 scala-2.12.7.msi
2. 配置环境变量
变量名:SCALA HOME
变量值:C:\Program Files(x86)\scala
变量名:Path
变量值:%SCALA HOME%\bin
3. 测试
CMD中执行scala-version命令
(二)、CentOS7安装Scala
1.下载Scala
到Scala官网nttps:/www.scala-lang.org/download/下载Linux安装包 scala-2.12.7.tgz
解压到指定目录:
tar -zxvf scala-2.12.7.tgz -C /opt/modules/
2. 配置环境变量
export SCALA HOME=/opt/modules/scala-2.12.7/
export PATH=SPATH:$SCALA HOME/bin
3. 测试
CMD中执行scala-version命令
三、Scala基础
(一)、变量声明
Scala中变量的声明使用关键字val和var。
声明一个val字符串变量str:
scala>val str=“hello scala”
str:String hello scala
声明变量时指定数据类型:
scala>val str:String=“hello scala”
str:String hello scala
将多个变量放在一起进行声明:
scala>val x,y=“hello scala”
x:String hello scala
y:String hello scala
Scala变量的声明,需要注意的地方总结如下:
- 定义变量需要初始化,否则会报错。
口定义变量时可以不指定数据类型,系统会根据初始化值推断变量的类型。 - Scala中鼓励优先使用val(常量),除非确实需要对其进行修改。
- Scala语句不需要写结束符,除非同一行代码使用多条语句时才需要使用分号隔开。
(二)、数据类型
1. 数组
下面的例子定义了一个类型为List[Any]的变量ist,Iist中包括字符串、整数、字符、布尔值和函数,由于这些元素都属于对象Ay的实例,因此可以将它们添加到ist中。
val list:List[Any]=List(
“a string”,
732,//an integer
‘c’,//a character
true,//a boolean value
()=>“an anonymous function returning a string”
)
2. 数据类型的转换
(三)、表达式
1、条件表达式
条件表达式主要是含有if/else的语句块:
scala> val i=1
i: Int = 1
scala> val result=if(i>0) 100 else -100
result: Int = 100
也可以在一个表达式中进行多次判断:
scala> val result=if(i>0) 100 else if(i==0) 50 else 10
result: Int = 100
2、块表达式
块表达式为包含在符号{}中的语句块:
scala> val result={
| val a=10
| val b=10
| a+b
| }
result: Int = 20
Scala中的返回值是最后一条语句的执行结果,而不需要像Java一样单独写return关键字。如果表达式中没有执行结果,则返回一个Unit对象,类似Java中的void:
scala> val result={
| val a=10
| }
result: Unit = ()
(四)、循环
1、for循环
for循环的语法:
for(变量<-集合或数组){
方法体
}
例如,循环从1到5输出变量i的值:
scala> for(i<- 1 to 5) println(i)
若不想包括5,可使用关键字until:
scala> for(i<- 1 until 5) println(i)
将字符串“hello”中的字符循环输出:
scala> val str=“hello”
scala> for(i<-0 until str.length) println(str(i))
将字符串看做一个由多个字符组成的集合,简化写法:
scala> for(i<-str) println(i)
2、while循环
while循环的语法:
while(条件)
{
循环体
}
例如:
scala> var i=1
i: Int = 1
scala> while(i<5){
| i=i+1
| println(i)
| }
3、do while循环
do while 循环与while循环类似,但是do while循环会确保至少执行一次循环。语法:
do {
循环体
} while(条件)
例如:
scala> do{
| i=i+1
| println(i)
| }while(i<5)
四、集合
Scala集合分为可变集合和不可变集合。可变集合可以对其中的元素进行修改、添加、移除;而不可变集合,永远不会改变,但是仍然可以模拟添加、移除或更新操作。这些操作都会返回一个新的集合,原集合的内容不发生改变。
五、Map映射
Scala中的Map也分可变的Map和不可变的Map,默认为不可变Map。
1、不可变Map
创建一个不可变Map:
val mp = Map(
“key1” -> “value1”,
“key2” -> “value2”,
“key3” -> “value3”
)
也可以使用以下写法:
val mp = Map(
(“key1” , “value1”),
(“key2” , “value2”),
(“key3” , “value3”)
)
循环输出上述Map中的键值数据:
for((k,v)<-mp){
println(k+“:”+v)
}
2、可变Map
创建可变Map需要引入类scala.collection.mutable.Map,创建方式与不可变Map相同。访问Map中key1的值,代码:
val mp = Map(
(“key1” , “value1”),
(“key2” , “value2”)
)
println(mp(“key1”))
修改键key1的值为value2,代码:
mp(“key1”)=“value2”
上述代码当key1存在时执行修改操作,若key1不存在则执行添加操作。
向Map中添加元素也可以使用+=符号:
mp+=(“key3” -> “value3”)
或
mp+=((“key3”,“value3”))
相对应的,从Map中删除一个元素可以使用-=符号:
mp-=“key3”
六、数组
Scala中的数组分为定长数组和变长数组,定长数组初始化后不可对数组长度进行修改,而变长数组则可以修改。
1、定长数组
定义数组的同时可以初始化数据:
val arr=Array(1,2,3)//自动推断数组类型
或者
val arr=ArrayInt//手动指定数据类型
也可以定义时指定数组长度,稍后对其添加数据:
val arr=new ArrayInt
arr(0)=1
arr(1)=2
arr(2)=3
可以使用for循环对数组进行遍历:
val arr=Array(1,2,3)
for(i<-arr){
println(i)
}
Scala对数组提供了很多常用的方法,使用起来非常方便:
val arr=Array(1,2,3)
//求数组中所有数值的和
val arrSum=arr.sum
//求数组中的最大值
val arrmAx=arr.max
//求数组中的最小值
val arrMin=arr.min
//对数组进行升序排序
val arrSorted=arr.sorted
//对数组进行降序排序
val arrReverse=arr.sorted.reverse
2、可变List
可变List需要使用scala.collection.mutable.ListBuffer类。
例如,创建一个可变List并初始化数据:
val listBuffer= ListBuffer(1, 2, 3)
或者创建时不初始化数据而是通过后面添加元素:
val listBuffer= new ListBufferInt
listBuffer+=1
listBuffer+=2
listBuffer+=3
也可以将两个List进行合并:
val listBuffer= ListBuffer(1, 2, 3)
val listBuffer3= ListBuffer(4, 5, 6)
println(listBuffer++listBuffer3)
输出结果:
ListBuffer(1, 2, 3, 4, 5, 6)