为什么要scala?
函数式语言,函数也是对象。
闭包特性。
和Java是一家。它比Java的语言复杂度低很多。
Spark是Scala实现的,用Scala可以写Spark上的程序。
安装和使用
scala代码以scala为文件扩展名。
和java一样,scala的程序也运行在JVM上。scala的官方编译工具是SBT。可支持交互式运行。 sbt把scala源代码编译成java字节码,这样在任何jvm中运行。
scalac命令 把源代码编译为jvm字节码,产生hello.class scalac hello.scala
scala命令 将字节码运行在jvm中 scala hello
语法
- 对于所有的类名的第一个字母要大写。
- 所有的方法名称的第一个字母用小写。
- 程序文件的名称建议与对象名称完全匹配。
- val 是只读变量, var是可变变量
-
单个冒号 用于连接变量名称和它的类型。
[] 方括号 用于来定义类型参数
_ 下划线, 主要用于通配、元素访问、遍历等代码偷懒用途
=>
implicit 的作用,可以用一句话来概括:在编译器出现错误的时候,可以通过隐式转换进行一次补救. 通过隐式转换,程序员可以在编写Scala程序时故意漏掉一些信息,让编译器去尝试在编译期间自动推导出这些信息来,
- 将方法或变量标记为implicit
- 将方法的参数列表标记为implicit
- 将类标记为implicit
asInstanceOf 、 isInstanceOf 类类型的判断和转换
classOf[T] 获取类型T的Class对象
TraversableOnce
class class就是一个普通的类,编译后只会生成一个文件;可以和object同名(此时class被称为伴生类,object被称为伴生对象) case class 样例类(case class)适合用于不可变的数据
object 在编译之后会生成两个.class文件,主要目的是为了模拟java的静态方法
extends … with …
值类型
Unit = {} 表示无值,和其他语言中void等同。用作不返回任何结果的方法的结果类型。Unit只有一个实例值,写成()。
Seq 用于表示按照一定顺序排列的元素序列。 用Java术语来说,Scala的Seq将是Java的List,而Scala的List将是Java的LinkedList。
函数
函数的返回值类型 在 冒号后面,等号前边。 函数的返回值 直接写在函数末尾,可以不加 return。
命名函数
def fun(x: Int):Int = x + 1
匿名函数
(x: Int) => x * 2
闭包
闭包是一种带有状态的函数,它的返回值取决于该函数作用于之外的某个值。
普通的函数像数学函数函数一样,一样的输入一定得到一样的输出。而闭包这种函数自带了一个影响因子,会对输出结果产生影响。这个影响因子的值是在该闭包对象创建时才决定好的。
Trait
一个类除了有一个祖先类继承特性之外,还应该有许许多多的特质(trait)是从不同的地方继承来的。
scala的类不仅可以从父类继承,还可以从一个或者多个traits引入。
class person {
...
}
trait Java {
val name: String
}
trait Scala {
val name: String
}
class programmer extends person with Java with Scala{
...
}
trait是不可以实例化的,也不可以有构造函数的。