Java变量定义
int a = 0;
在scala中,可以使用val或者var来定义变量,语法格式如下:
val/var 变量标识:变量类型 = 初始值
其中
- val定义的是不可重新赋值的变量
- var定义的是可重新赋值的变量
- scala中定义变量类型写在变量名后面
- scala的语句最后不需要添加分号
定义一个变量
示例:定义一个变量保存一个人的名字"tom"
参考代码
scala> val name:String = "tom"
name: String = tom
val和var变量
示例
给名字变量进行重新赋值为Jim,观察其运行结果
参考代码
scala> name = "Jim"
<console>:12: error: reassignment to val
name = "Jim"
示例
使用var重新定义变量来保存名字"tom",并尝试重新赋值为Jim,观察其运行结果
参考代码
scala> var name:String = "tom"
name: String = tom
scala> name = "Jim"
name: String = Jim
类型推断定义变量
scala的语法要比Java简洁,我们可以使用一种更简洁的方式来定义变量。
示例
使用更简洁的语法定义一个变量保存一个人的名字"tom"
参考代码
scala> val name = "tom"
name: String = tom
scala可以自动根据变量的值来自动推断变量的类型,这样编写代码更加简洁。
惰性赋值
在企业的大数据开发中,有时候会编写非常复杂的SQL语句,这些SQL语句可能有几百行甚至上千行。这些SQL语句,如果直接加载到JVM中,会有很大的内存开销。如何解决?
当有一些变量保存的数据较大时,但是不需要马上加载到JVM内存。可以使用惰性赋值来提高效率。
语法格式:
lazy val 变量名 = 表达式
参考代码
scala> lazy val sql = """insert overwrite table adm.itcast_adm_personas
| select
| a.user_id,
....
| left join gdm.itcast_gdm_user_buy_category c on a.user_id=c.user_id
| left join gdm.itcast_gdm_user_visit d on a.user_id=d.user_id;"""
sql: String = <lazy>
字符串
scala提供多种定义字符串的方式,将来我们可以根据需要来选择最方便的定义方式。
- 使用双引号
- 使用插值表达式
- 使用三引号
使用双引号
语法
val/var 变量名 = “字符串”
参考代码
val name="hadoop6"
scala> println(name + name.length)
hadoop6
使用插值表达式
插值表达式可以有效避免大量字符串的拼接。
语法
val/var 变量名 = s"${变量/表达式}字符串"
在定义字符串之前添加s
在字符串中,可以使用${}来引用变量或者编写表达式
示例
若干个变量,分别保存:"zhangsan"、30、"male",定义一个字符串,保存这些信息。
打印输出:name=zhangsan, age=30, sex=male
参考代码
scala> val name = "zhangsan"
name: String = zhangsan
scala> val age = 30
age: Int = 30
scala> val sex = "male"
sex: String = male
scala> val info = s"name=${name}, age=${age}, sex=${sex}"
info: String = name=zhangsan, age=30, sex=male
scala> println(info)
name=zhangsan, age=30, sex=male
使用三引号
大段的文本需要保存,可以使用三引号来定义字符串。例如:保存一大段的SQL语句。三个引号中间的所有字符串都将作为字符串的值。
语法
val/var 变量名 = """字符串1
字符串2"""
参考代码
val sql = """select
| *
| from
| t_user
| where
| name = "zhangsan""""
println(sql)
scala类型层次结构
|
类型 |
说明 |
|
Any |
所有类型的父类,,它有两个子类AnyRef与AnyVal |
|
AnyVal |
所有数值类型的父类 |
|
AnyRef |
所有对象类型(引用类型)的父类 |
|
Unit |
表示空,Unit是AnyVal的子类。它类似于Java中的void,但scala要比Java更加面向对象 |
|
Null |
Null是AnyRef的子类,也就是说它是所有引用类型的子类。可以将null赋值给任何对象类型 |
|
Nothing |
所有类型的子类 不能直接创建该类型实例,某个方法抛出异常时,返回的就是Nothing类型,因为Nothing是所有类的子类,那么它可以赋值为任何类型 |
nothing
def main(args: Array[String]): Unit = {
val c = m3(1,0)
}
def m3(x:Int, y:Int):Int = {
if(y == 0) throw new Exception("这是一个异常")
x / y
}
问题
以下代码是否有问题?
val b:Int = null
scala会解释报错:
Null类型并不能转换为Int类型,说明Null类型并不是Int类型的子类