Scala基础
目录
- 什么是Scala
- 安装Scala
- Scala基础
- 集合
- 类与对象
- 抽象类和特质
什么是Scala
Scala是一种将面向对象和函数式编程结合在一起的高级语言,旨在以简洁、优雅和类型安全的方式表达通用编程模式。Scala功能强大,不仅可以编写简单脚本,还可以构建大型系统。
Scala运行于Java平台,Scala程序会通过JVM被编译成class字节码文件,然后在操作系统上运行。其运行时候的性能通常与Java程序不分上下,并且Scala代码可以调用Java方法、继承Java类、实现Java接口等,几乎所有Scala代码都大量使用了Java类库。
由于Spark主要是由Scala语言编写的,为了后续更好的学习Spark以及使用Scala编写Spark应用程序,需要首先学习使用Scala语言。
安装Scala
由于Scala运行于Java平台,因此安装Scala之前需要确保系统安装了JDK。此处使用的Scala版本为2.12.7,要求JDK版本为1.8。
Windows安装Scala
-
下载Scala
到Scala官网 https://www.scala-lang.org/download/ 下载Windows安装包scala-2.12.7.msi -
配置环境变量
- 变量名:
SCALA_HOME
- 变量值:
C:\Program Files (x86)\scala
- 变量名:
Path
- 变量值:
%SCALA_HOME%\bin
- 变量名:
-
测试
在CMD中执行scala -version
命令
CentOS7安装Scala
-
下载Scala
到Scala官网 https://www.scala-lang.org/download/ 下载Linux安装包scala-2.12.7.tgz
解压到指定目录:$ tar -zxvf scala-2.12.7.tgz -C /opt/modules/
-
配置环境变量
export SCALA_HOME=/opt/modules/scala-2.12.7/ export PATH=$PATH:$SCALA_HOME/bin
-
测试
在CMD中执行scala -version
命令
Scala基础
最初学习Scala的时候建议在Scala命令行模式中操作,最终程序的编写可以在IDE中进行。在Windows CMD窗口中或CentOS的Shell命令中执行 scala
命令,即可进入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中鼓励优先使用
val
(常量),除非确实需要对其进行修改。 - Scala语句不需要写结束符,除非同一行代码使用多条语句时才需要使用分号隔开。
数据类型
在Scala中,所有的值都有一个类型,包括数值和函数。
Any类型
Any是Scala类层次结构的根,也被称为超类或顶级类。Scala执行环境中的每个类都直接或间接地从该类继承。该类中定义了一些通用的方法,例如equals()
、hashCode()
和toString()
。
AnyVal类型
AnyVal表示值类型。有9种预定义的值类型,它们是非空的Double
、Float
、Long
、Int
、Short
、Byte
、Char
、Unit
和Boolean
。
AnyRef类型
AnyRef表示引用类型。所有非值类型都被定义为引用类型。Scala中的每个用户定义类型都是AnyRef的子类型。AnyRef对应于Java中的Java.lang.Object
。
Nothing类型
Nothing是所有类型的子类,在Scala类层级的最低端。Nothing没有对象,因此没有具体值,但是可以用来定义一个空类型,类似于Java中的标示性接口。
Null类型
Null是所有引用类型(AnyRef)的子类,所以Null可以赋值给所有的引用类型,但不能赋值给值类型。
表达式
Scala中常用的表达式主要有条件表达式和块表达式。
条件表达式
条件表达式主要是含有if/else
的语句块:
scala> val i=1
i: Int = 1
scala> val result=if(i>0) 100 else -100
result: Int = 100
块表达式
块表达式为包含在{}
中的语句块:
scala> val result={
| val a=10
| val b=10
| a+b
|}
result: Int = 20
Scala中的返回值是最后一条语句的执行结果。
循环
Scala中的循环主要有for
循环、while
循环和do while
循环三种。
for循环
scala> for(i<- 1 to 5) println(i)
while循环
scala> var i=1
i: Int = 1
scala> while(i<5){
| i=i+1
| println(i)
| }
do while循环
scala> do{
| i=i+1
| println(i)
| }while(i<5)
方法与函数
Scala中有方法与函数。Scala 方法是类或对象中定义的成员,而函数是一个对象,可以将函数赋值给一个变量。
方法定义
def 方法名 (参数列表):返回类型={
方法体
}
函数定义
(参数列表) => 函数体
集合
Scala集合分为可变集合和不可变集合。
数组
val arr=Array(1,2,3)
List
val nums: List[Int] = List(1, 2, 3, 4)
Map映射
val mp = Map(
"key1" -> "value1",
"key2" -> "value2"
)
元组
val t=(1,"scala",2.6)
Set
val set = Set(1,2,3)
类和对象
类的定义
class User{
private var age=20
def count(){
age+=1
}
}
单例对象
object Person{
private var name="zhangsan"
private var age=20
def showInfo():Unit={
println("姓名:"+name+",年龄:"+age)
}
}
伴生对象
class Person() {
private var name="zhangsan"
def showInfo(){
println("年龄:"+Person.age) //访问伴生对象的私有成员
}
}
object Person{
private var age=20
def main(args: Array[String]): Unit = {
var per=new Person()
println("姓名:"+per.name) //访问伴生类的私有成员
per.showInfo()
}
}
get和set方法
class Person {
private var privateName="zhangsan"
def name=privateName //定义get方法
def name_=(name:String): Unit ={
this.privateName=name
}
}
构造器
class Person(val name:String,var age:Int=18) {
// ...
}
抽象类
abstract class Person {
var name:String //抽象字段
var age:Int
def speak() //抽象方法
}
特质
trait Pet {
var name:String //抽象字段
var age:Int
def run //抽象方法
}