1. 变量定义
在scala中定义变量有两个关键字:val、var
val:不可变的,即不可再次给其赋值,类似于java中被final修饰的常量
var: 可变的,即可以再次给他赋值
声明变量的通用格式
关键字变量名:变量的类型=变量值
在scala程序中,通常建议使用val ,也就是常量,因为比如类似spark的大型复杂系统中,需要大量的网络传输数据,如果使用var,可能担心会被错误的更改
1 | // 定义常量 不可修改 val 修饰的变量不可以修改相当于在Java中被final修饰一样 |
var 可变,可重新赋值,赋值为”_”表示缺省值(0, false, null),例如:
1 | var d:Double = _ // d = 0.0 |
val 不可变,相当于const/final,但如果val为数组或者List,val的元素可以赋值;
1 | val pi1 = 3. // 相当于3.0d |
2. lazy, val, def的区别
| 关键字 | 说明 | 示例 |
|---|---|---|
| val | 定义时就一次求值完成,保持不变 | val f = 10+20 // 30 |
| lazy | 定义时不求值,第一次使用时完成求值,保持不变 | lazy f = 10+20 // |
| def | 定义时不求值,每次使用时都重新求值 (无参,缺省返回值类型的函数定义) |
def f = 10+20 // 30 def t = System. currentTimeMillis // 每次不一样 |
1 | // 定义之后不会立即赋值,等到使用时才会赋值,以后每次使用时值不变 |
3. 基本操作符
scala的算术操作符与java的没有什么区别,比如+、-、*、/、%等 以及&、|、>>、<<
但是在scala中,这些操作符其实是数据类的方法,比如 1+ 1 ,可以写作1.+(1)
例如 1.to(10) 又可以写成1 to 10
scala中没有提供++、–的操作符,我们只能用+ 和 – ,
比如counter = 1, counter++ 是错误的,必须写成counter += 1
3.1 区分 <- , => , ->
| 符号 | 示例 | 说明 |
|---|---|---|
| <- | for (i <- 0 until 100) | 用于for循环, 符号∈的象形 |
| => | List(1,2,3).map(x=> xx) ((i:Int)=>ii)(5) // 25 |
用于匿名函数 也可用在import中定义别名:import javax.swing.{JFrame=>jf} |
| -> | Map(1->“a”,2->“b”) | 用于Map初始化, 也可以不用 -> 而写成 Map((1,“a”),(2,“b”)) |
3.2 Null, None, Nil, Nothing 的区别
| 关键字 | 说明 |
|---|---|
| Null | Trait,其唯一实例为null,是AnyRef的子类,不是 AnyVal的子类 |
| Nothing | Trait,所有类型(包括AnyRef和AnyVal)的子类,没有实例 |
| None | Option的两个子类之一,另一个是Some,用于安全的函数返回值 |
| Unit | 无返回值的函数的类型,和java的void对应 |
| Nil | 长度为0的List |
3.3 一元操作符unary_
1 | //(置前)可用unary_。 |