Scala介绍
什么是Scala
从英文的角度来讲,Scala并不是一个单词,而是Scalable Language两个单词的缩写,表示可伸缩语言的意思。从计算机的角度来讲,Scala是一门完整的软件编程语言,那么连在一起就表示Scala是一门可伸缩的软件编程语言。之所以说它是可伸缩,是因为这门语言体现了面向对象,函数式编程等多种不同的语言范式,且融合了不同语言新的特性。
Scala编程语言是由联邦理工学院洛桑(EPFL)的Martin Odersky于2001年基于Funnel的工作开始设计并开发的。由于Martin Odersky之前的工作是开发通用Java和Javac(Sun公司的Java编译器),所以基于Java平台的Scala语言于2003年底/2004年初发布。
截至到2020年5月,Scala最新版本为2.13.2,支持JVM和JavaScript
Scala官网:https://www.scala-lang.org/
Scala在大数据领域的作用
1)大数据主要的批处理计算引擎框架Spark是基于Scala语言开发的
2)大数据主要的流式计算引擎框架Flink也提供了Scala相应的API
3)大数据领域中函数式编程的开发效率更高,更直观,更容易理解
Java and Scala
Martin Odersky是狂热的编译器爱好者,长时间的编程后,希望开发一种语言,能够让写程序的过程变得简单,高效,所以当接触到Java语言后,感受到了这门语言的魅力,决定将函数式编程语言的特性融合到Java语言中,由此产生了2门语言(Pizza & Scala),这两种语言极大地推动了Java语言的发展
- JDK1.5的泛型,增强for循环,自动类型转换等都是从Pizza语言引入的新特性
- JDK1.8的类型推断,λ(lambda)表达式是从Scala语言引入的新特性
由上可知,Scala语言是基于Java开发的,所以其编译后的文件也是字节码文件,并可以运行在JVM中。
快速上手
Scala环境安装
1)安装JDK 1.8(略)
2)安装Scala2.12
- 解压文件:scala-2.12.11.zip,解压目录要求无中文无空格
- 配置环境变量
3)环境测试
如果出现如下窗口内容,表示环境安装成功
Scala插件安装
默认情况下IDEA不支持Scala的开发,需要安装Scala插件。
Hello Scala案例
1)创建Maven项目
2)增加Scala框架支持
默认情况,IDEA中创建项目时不支持Scala的开发,需要添加Scala框架的支持。
3)创建类
在main文件目录中创建Scala类:com.atguigu.bigdata.scala.HelloScala
object HelloScala {
def main(args: Array[String]): Unit = {
System.out.println("Hello Scala")
println("Hello Scala")
}
}
4)代码解析
如果只是通过代码来进行语法的解析,并不能了解其真正的实现原理。scala语言是基于Java语言开发的,所以也会编译为class文件,那么我们可以通过反编译指令javap
javap -c -l 类名
或反编译工具jd-gui.exe查看scala编译后的代码。
第2章 变量和数据类型
注释
Scala注释使用和Java完全一样。
单行注释
object ScalaComment{
def main(args: Array[String]): Unit = {
// 单行注释
}
}
多行注释
object ScalaComment{
def main(args: Array[String]): Unit = {
/*
多行注释
*/
}
}
文档注释
/**
* doc注释
*/
object ScalaComment{
def main(args: Array[String]): Unit = {
}
}
变量
变量是一种使用方便的占位符,用于引用计算机内存地址,变量创建后会占用一定的内存空间。基于变量的数据类型,操作系统会进行内存分配并且决定什么将被储存在保留内存中。因此,通过给变量分配不同的数据类型,你可以在这些变量中存储整数,小数或者字母。
语法声明
变量的类型在变量名之后等号之前声明。
object ScalaVariable {
def main(args: Array[String]): Unit = {
// var | val 变量名 :变量类型 = 变量值
// 用户名称
var username : String = "zhangsan"
// 用户密码
val userpswd : String = "000000"
}
}
变量的类型如果能够通过变量值推断出来,那么可以省略类型声明,这里的省略,并不是不声明,而是由Scala编译器在编译时自动声明编译的。
object ScalaVariable {
def main(args: Array[String]): Unit = {
// 因为变量值为字符串,又因为Scala是静态类型语言,所以即使不声明类型
// Scala也能在编译时正确的判断出变量的类型,这体现了Scala语言的简洁特性。
var username = "zhangsan"
val userpswd = "000000"
}
}
变量初始化
Java语法中变量在使用前进行初始化就可以,但是Scala语法中是不允许的,必须显示进行初始化操作。
object ScalaVariable {
def main(args: Array[String]): Unit = {
var username // Error
val username = "zhangsan" // OK
}
}
可变变量
值可以改变的变量,称之为可变变量,但是变量类型无法发生改变, Scala中可变变量使用关键字var进行声明
object ScalaVariable {
def main(args: Array[String]): Unit = {
// 用户名称
var username : String = "zhangsan"
username = "lisi" // OK
username = true // Error
}
}
不可变变量
值一旦初始化后无法改变的变量,称之为不可变变量。Scala中不可变变量使用关键字val进行声明, 类似于Java语言中的final关键字
object ScalaVariable {
def main(args: Array[String]): Unit = {
// 用户名称
val username : String = "zhangsan"
username = "lisi" // Error
username = true // Error
}
}
标识符
Scala 可以使用两种形式的标志符,字符数字和符号。
字符数字使用字母或是下划线开头,后面可以接字母或是数字,符号"$"在 Scala 中也看作为字母。
然而以"$"开头的标识符为保留的 Scala 编译器产生的标志符使用,应用程序应该避免使用"$"开始的标识符,
以免造成冲突。
Scala 的命名规则采用和 Java 类似的 camel 命名规范,首字符小写,
比如 toString。类名的首字符还是使用大写。此外也应该避免使用以下划线结尾的标志符以避免冲突。
Scala 内部实现时会使用转义的标志符,比如:-> 使用 $colon$minus$greater 来表示这个符号
// 和Java一样的标识符命名规则
val name = "zhangsan" // OK
val name1 = "zhangsan0" // OK
//val 1name = "zhangsan0" // Error
val name$ = "zhangsan1" // OK
val $name = "zhangsan2" // OK
val name_ = "zhangsan3" // OK
val _name = "zhangsan4" // OK
val $ = "zhangsan5" // OK
val _ = "zhangsan6" // OK
//val 1 = "zhangsan6" // Error
//val true = "zhangsan6" // Error
// 和Java不一样的标识符命名规则
val + = "lisi" // OK
val - = "lisi" // OK
val * = "lisi" // OK
val / = "lisi" // OK
val ! = "lisi" // OK
//val @ = "lisi" // Error
val @@ = "lisi" // OK
//val # = "lisi" // Error
val ## = "lisi" // OK
val % = "lisi" // OK
val ^ = "lisi" // OK
val & = "lisi" // OK
//val ( = "lisi" // Error
//val ( = "lisi" // Error
//val ) = "lisi" // Error
//val = = "lisi" // Error
val == = "lisi" // OK
//val [ = "lisi" // Error
//val ] = "lisi" // Error
//val : = "lisi" // Error
val :: = "lisi" // OK
//val ; = "lisi" // Error
//val ' = "lisi" // Error
//val " = "lisi" // Error
val "" = "lisi" // OK
val < = "lisi" // OK
val > = "lisi" // OK
val ? = "lisi" // OK
val | = "lisi" // OK
val \ = "lisi" // OK
//val ` = "lisi" // Error
val ~ = "lisi" // OK
val :-> = "wangwu" // OK
val :-< = "wangwu" // OK
// 能声明和能使用是两回事
Scala关键字