【scala系列】3、变量/常量的定义,操作符介绍


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 // f // 30
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)=>i
i)(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

文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
 上一篇
【scala系列】4、流程控制、循环介绍 【scala系列】4、流程控制、循环介绍
1. Scala条件运算符 运算符 操作 描述 && 与 运算符左侧和右侧的值为true。仅当左侧为真时,右侧才被计算。 || 或 左侧或右侧的至少一个值为true。仅当左边为假时才计算右侧。 > 大
2020-03-20
下一篇 
【scala系列】2、基本数据类型介绍 【scala系列】2、基本数据类型介绍
1. 数据类型概览 在scala中有以下数据类型 数据类 描述 Byte 8位有符号补码整数。数值区间为 -128 到 127 Short 16位有符号补码整数。数值区间为 -32768 到 32767 Int 32位有
2020-03-17
  目录