目录
简介
1- Scala 特性
面向对象特性
Scala是一种纯面向对象的语言,每个值都是对象。对象的数据类型以及行为由类和特质描述。
类抽象机制的扩展有两种途径:一种途径是子类继承,另一种途径是灵活的混入机制。这两种途径能避免多重继承的种种问题。
函数式编程
Scala也是一种函数式语言,其函数也能当成值来使用。Scala提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala的case class及其内置的模式匹配相当于函数式编程语言中常用的代数类型。
更进一步,程序员可以利用Scala的模式匹配,编写类似正则表达式的代码处理XML数据。
静态类型
Scala具备类型系统,通过编译时检查,保证代码的安全性和一致性。类型系统具体支持以下特性:
- 泛型类
- 协变和逆变
- 标注
- 类型参数的上下限约束
- 把类别和抽象类型作为对象成员
- 复合类型
- 引用自己时显式指定类型
- 视图
- 多态方法
扩展性
Scala的设计秉承一项事实,即在实践中,某个领域特定的应用程序开发往往需要特定于该领域的语言扩展。Scala提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构:
- 任何方法可用作前缀或后缀操作符
- 可以根据预期类型自动构造闭包。
并发性
Scala使用Actor作为其并发模型,Actor是类似线程的实体,通过邮箱发收消息。Actor可以复用线程,因此可以在程序中可以使用数百万个Actor,而线程只能创建数千个。在2.10之后的版本中,使用Akka作为其默认Actor实现。
2- 基本语法
区分大小写
- Scala是大小写敏感的, 这意味着标识Hello 和 hello在Scala中会有不同的含义
类名
- 对于所有的类名的第一个字母要大写
- 如果使用几个单词来构成一个类的名称, 每个单词的第一个字母要大写
- 示例: class MyScalaClass
方法名称
- 所有的方法名称的第一个字母用小写
- 如果若干单词被用于构成方法的名称, 则每个单词的第一个字母要大写(第一个小写)
- 示例: def myMethod()
程序文件名
- 程序文件的名称应该域对象名称完全匹配(新版本不需要了, 建议保留这个习惯)
- 保存文件时, 应该保存它使用的对象名称(区分大小写), 并追加".scala"为文件扩展名. (如果文件名和对象名称不匹配, 程序将无法编译).
- 示例: 假设"HelloWorld"是对象名称, 那么该文件应保存为"HelloWorld.scala"
main()方法
- def main(args:Array[String]) - Scala 程序从main()方法开始处理, 这是每一个Scala程序的强制程序入口部分.
第一章 基础
1- 常用类型
Scala中常用类型如下:
- Byte
- Char
- Short
- Int
- Long
- FLOAT
- Double
- Booean
这些类型都是类, 所以在Scala中不需要包装类型, 在基本类型和包装类型之间的转换工作是 Scala编译的事.
除此之外, 还有 NULL 类型, 代指NULL 或者空引号.
Nothing 是所有其它类型的子类型, 包括空值.
Any是其它类型的父类型, AnyRef 是其它引用类型的父类型.
在Scala中, 我们使用方法而不是强制类型转换, 来做数值类型之间的转换. 例如:
println(5.13.toInt) // 5
println(101.toChar) // e
println("2024".toInt - 24) // 2000
和Java一样, toString 将任意对象转换成字符串, 要将包含了数字的字符串转换成数字, 使用 toInt 或者 toDouble .
2- 算术和操作符重载
和java相比, Scala并没有提供 ++ 和 – 操作符, 我们需要使用 +=1 或者 -=1
对于常规的 BigInt 和 BigDecimal 对象, 我们可以使用常规的方法使用那些数学操作符 :
var a = 10
val b = a * a * a
println(a) // 10
println(b) // 1000
a += 2
println(a) // 12
a -= 2
println(a) // 10
3- 调用函数和方法
相比java, 在Scala中使用数学函数更简单, 我们不需要从某个类的调用它的静态方法.
import scala.math._
println(sqrt(9)) // 3.0
println(pow(2,4)) // 16.0
在使用以Scala开头的包时, 我们可以省略Scala的前缀. 例如 急迫有import math._ 等价于 import scala.math._ ;
Scala中没有静态方法, 但是提供了单例对象.
不带参数的方法通常不使用圆括号, 一般来讲, 没有参数并不改变当前对象的方法都不带圆括号.
Scala中语序使用数字 ‘*’ 字符串, 从而实现复制字符串的功能.
4- apply方法
在Scala中, 我们通常使用类似函数调用的语法. 例如:
println("Hello"(4)) // o
你可以将这种用法当作 () 操作符的重载形势, 它背后原理是现实一个名为 apply 的方法.
所以"Hello"(4) 相当于一下代码:
println("Hello".apply(4)) // o