1. 变量定义
在scala中定义变量有两个关键字:val、var
val:不可变的,即不可再次给其赋值,类似于java中被final修饰的常量
var: 可变的,即可以再次给他赋值
声明变量的通用格式
关键字变量名:变量的类型=变量值
在scala程序中,通常建议使用val ,也就是常量,因为比如类似spark的大型复杂系统中,需要大量的网络传输数据,如果使用var,可能担心会被错误的更改
// 定义常量 不可修改 val 修饰的变量不可以修改相当于在Java中被final修饰一样
val pi1 = 3. // 相当于3.0d
val pi2 = 3.f // 相当于3.0f
// 定义变量 可以修改,比如 相当于年龄 每年都会变化,
var age:Int = 53
// 使用var 修饰的变量可以修改
age=54
//声明变量可以将变量类型省略, scala会根据变量的值自动推断出变量的类型
val sex = "男"
println(sex.getClass) //class java.lang.String
//也可以使用Any 作为变量类型,Any类似于java中的Object
val color:Any = true
//可以一次声明多个变量
val n3,n4,n5 = "小明"
var n6,n7,n8 : String = "小明"
var 可变,可重新赋值,赋值为”_”表示缺省值(0, false, null),例如:
var d:Double = _ // d = 0.0
var i:Int = _ // i = 0
var s:String = _ // s = null
var t:T = _ // 泛型T对应的默认值
//注意:仅 val可用"_"表示缺省值赋值。
val 不可变,相当于const/final,但如果val为数组或者List,val的元素可以赋值;
val pi1 = 3. // 相当于3.0d
val pi2 = 3.f // 相当于3.0f
//提示:向函数式风格推进的一个方式,就是尝试不用任何var来定义变量
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 // 每次不一样 |
// 定义之后不会立即赋值,等到使用时才会赋值,以后每次使用时值不变
lazy val l1 = System.currentTimeMillis
// 定义之后立即赋值,以后每次使用时值不变
val l2 = System.currentTimeMillis
// 定义函数,以后每次使用时重新计算值
def l3 = System.currentTimeMillis
println(s"l2=>$l2") //1586317603721
Thread.sleep(1000)
println(s"l1=>$l1") //1586317604732
Thread.sleep(1000)
println(s"l3=>$l3") //1586317605734
println(s"l2=>$l2") //1586317603721
Thread.sleep(1000)
println(s"l1=>$l1") //1586317604732
Thread.sleep(1000)
println(s"l3=>$l3") //1586317607740
println(s"l2=>$l2") //1586317603721
Thread.sleep(1000)
println(s"l1=>$l1") //1586317604732
Thread.sleep(1000)
println(s"l3=>$l3") //1586317603721
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_
//(置前)可用unary_。
注:unary :一元的,单一元素的, 单一构成的 。发音:【`ju: ne ri】
-2,相当于:(2).unary_- // -2
+2,相当于:(2).unary_+ // 2
!true, 相当于:(true).unary_! // false
~0,相当于 (0).unary_~ // -1