Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。
背景
- 因为Spark是由Scala开发的,所以在开发Spark应用程序之前要对Scala语言学习。虽然Spark也支持Java、Python语言,但是作为一名Java程序猿,还是决定要学习Scala。
- Scala是运行在JVM上一门语言。开发效率非常高、语法丰富简洁,三两行Scala代码能搞定Java要写的一大坨代码。
- Scala的语法糖太甜~~
Scala特性
面向对象特性
- Scala是一种纯面向对象的语言,每个值都是对象。
函数式编程
-
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持
高阶函数(操作函数的函数)
,允许嵌套多层函数,并支持柯里化。Scala的case class
及其内置的模式匹配相当于函数式编程语言中常用的代数类型。 -
可以利用Scala的模式匹配,编写类似正则表达式的代码处理数据。
并发性
- Scala使用Actor作为其并发模型,Actor是类似线程的实体,通过“邮箱”发收消息。Actor可以复用线程,因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。在2.10之后的版本中,使用Akka作为其默认Actor实现。
基本语法
- 区分大小写:Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义。
- 类名:对于所有的类名的第一个字母要大写。
示例:class MyFirstScalaClass
- 方法名称:所有的方法名称的第一个字母用小写。
示例:def myMethodName()
- 程序文件名:程序文件的名称应该与对象名称完全匹配(文件名和对象名称不匹配,程序将无法编译)。
def main(args: Array[String])
:Scala程序从main()
方法开始处理,这是每一个Scala程序的强制程序入口部分。
声明变量、常用类型
- scala代码会被编译成字节码,然后交给Java虚拟机执行。
- 不强制指定变量的类型,编译器会推断出来。
scala> 8 * 5
res0: Int = 40
- val定义的值无法改变它的内容。在Scala中,鼓励使用val。
scala> val answer = 8 * 5
answer: Int = 40
scala> answer = 10
<console>:8: error: reassignment to val
answer = 10
- 如果要声明其值可变的变量,用var。
scala> var counter = 0
counter: Int = 0
scala> counter = 10
counter: Int = 10
- 变量或函数的类型总是写在变量或函数名称后面,与Java的习惯不同。
scala> val greeting : String = "Hello"
greeting: String = Hello
- 不需要使用分号最后,仅当同一行代码中存在多条语句时才需要分号隔开。
- 常用的数据类型与Java一样,
Byte、Char、Short、Int、Long、Float、Double及Boolean
,这些都是类。 - 在基本类型和包装类型之间的转换是Scala编译器的工作。
+-*/%
等操作符实际上是方法。- 对于
BigInt
和BigDecimal
对象,可以以常规的方式使用数学操作符(但在Java中同样的操作要写成x.multiply(x))。
scala> val x : BigInt = 123
x: BigInt = 123
scala> x * x
res1: scala.math.BigInt = 15129
- 不带参数的Scala方法通常不使用圆括号,一般没有参数且不改变当前对象的方法不带圆括号。