Scala 系列(二)—— 基本数据类型和运算符
一、数据类型
1.1 类型支持
scala 拥有下表所示的数据类型,其中 byte、short、int、long 和 char 类型统称为整数类型,整数类型加上 float 和 double 统称为数值类型。scala 数值类型的取值范围和 java 对应类型的取值范围相同。
数据类型 | 描述 |
---|---|
byte | 8 位有符号补码整数。数值区间为 -128 到 127 |
short | 16 位有符号补码整数。数值区间为 -32768 到 32767 |
int | 32 位有符号补码整数。数值区间为 -2147483648 到 2147483647 |
long | 64 位有符号补码整数。数值区间为 -9223372036854775808 到 9223372036854775807 |
float | 32 位, ieee 754 标准的单精度浮点数 |
double | 64 位 ieee 754 标准的双精度浮点数 |
char | 16 位无符号 unicode 字符, 区间值为 u+0000 到 u+ffff |
string | 字符序列 |
boolean | true 或 false |
unit | 表示无值,等同于 java 中的 void。用作不返回任何结果的方法的结果类型。unit 只有一个实例值,写成 ()。 |
null | null 或空引用 |
nothing | nothing 类型在 scala 的类层级的最低端;它是任何其他类型的子类型。 |
any | any 是所有其他类的超类 |
anyref | anyref 类是 scala 里所有引用类 (reference class) 的基类 |
1.2 定义变量
scala 的变量分为两种,val 和 var,其区别如下:
- val : 类似于 java 中的 final 变量,一旦初始化就不能被重新赋值;
- var :类似于 java 中的非 final 变量,在整个声明周期内 var 可以被重新赋值;
scala> val a=1 a: int = 1 scala> a=2 <console>:8: error: reassignment to val // 不允许重新赋值 scala> var b=1 b: int = 1 scala> b=2 b: int = 2
1.3 类型推断
在上面的演示中,并没有声明 a 是 int 类型,但是程序还是把 a 当做 int 类型,这就是 scala 的类型推断。在大多数情况下,你都无需指明变量的类型,程序会自动进行推断。如果你想显式的声明类型,可以在变量后面指定,如下:
scala> val c:string="hello scala" c: string = hello scala
1.4 scala解释器
在 scala 命令行中,如果没有对输入的值指定赋值的变量,则输入的值默认会赋值给 resx
(其中 x 是一个从 0 开始递增的整数),res
是 result 的缩写,这个变量可以在后面的语句中进行引用。
scala> 5 res0: int = 5 scala> res0*6 res1: int = 30 scala> println(res1) 30
二、字面量
scala 和 java 字面量在使用上很多相似,比如都使用 f 或 f 表示浮点型,都使用 l 或 l 表示 long 类型。下文主要介绍两者差异部分。
scala> 1.2 res0: double = 1.2 scala> 1.2f res1: float = 1.2 scala> 1.4f res2: float = 1.4 scala> 1 res3: int = 1 scala> 1l res4: long = 1 scala> 1l res5: long = 1
2.1 整数字面量
scala 支持 10 进制和 16 进制,但不支持八进制字面量和以 0 开头的整数字面量。
scala> 012 <console>:1: error: decimal integer literals may not have a leading zero. (octal syntax is obsolete.)
2.2 字符串字面量
1. 字符字面量
字符字面量由一对单引号和中间的任意 unicode 字符组成。你可以显式的给出原字符、也可以使用字符的 unicode 码来表示,还可以包含特殊的转义字符。
scala> '\u0041' res0: char = a scala> 'a' res1: char = a scala> '\n' res2: char =
2. 字符串字面量
字符串字面量由双引号包起来的字符组成。
scala> "hello world" res3: string = hello world
3.原生字符串
scala 提供了 """ ... """
语法,通过三个双引号来表示原生字符串和多行字符串,使用该种方式,原生字符串中的特殊字符不会被转义。
scala> "hello \tool" res4: string = hello ool scala> """hello \tool""" res5: string = hello \tool scala> """hello | world""" res6: string = hello world
2.3 符号字面量
符号字面量写法为: '标识符
,这里 标识符可以是任何字母或数字的组合。符号字面量会被映射成 scala.symbol
的实例,如:符号字面量 'x
会被编译器翻译为 scala.symbol("x")
。符号字面量可选方法很少,只能通过 .name
获取其名称。
注意:具有相同 name
的符号字面量一定指向同一个 symbol 对象,不同 name
的符号字面量一定指向不同的 symbol 对象。
scala> val sym = 'id008 sym: symbol = 'id008 scala> sym.name res12: string = id008
2.4 插值表达式
scala 支持插值表达式。
scala> val name="xiaoming" name: string = xiaoming scala> println(s"my name is $name,i'm ${2*9}.") my name is xiaoming,i'm 18.
三、运算符
scala 和其他语言一样,支持大多数的操作运算符:
- 算术运算符(+,-,*,/,%)
- 关系运算符(==,!=,>,<,>=,<=)
- 逻辑运算符 (&&,||,!,&,|)
- 位运算符 (~,&,|,^,<<,>>,>>>)
- 赋值运算符 (=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=)
以上操作符的基本使用与 java 类似,下文主要介绍差异部分和注意事项。
3.1 运算符即方法
scala 的面向对象比 java 更加纯粹,在 scala 中一切都是对象。所以对于 1+2
,实际上是调用了 int 类中名为 +
的方法,所以 1+2,也可以写成 1.+(2)
。
scala> 1+2 res14: int = 3 scala> 1.+(2) res15: int = 3
int 类中包含了多个重载的 +
方法,用于分别接收不同类型的参数。
3.2 逻辑运算符
和其他语言一样,在 scala 中 &&
,||
的执行是短路的,即如果左边的表达式能确定整个结果,右边的表达式就不会被执行,这满足大多数使用场景。但是如果你需要在无论什么情况下,都执行右边的表达式,则可以使用 &
或 |
代替。
3.3 赋值运算符
在 scala 中没有 java 中的 ++
和 --
运算符,如果你想要实现类似的操作,只能使用 +=1
,或者 -=1
。
scala> var a=1 a: int = 1 scala> a+=1 scala> a res8: int = 2 scala> a-=1 scala> a res10: int = 1
3.4 运算符优先级
操作符的优先级如下:优先级由上至下,逐级递减。
在表格中某个字符的优先级越高,那么以这个字符打头的方法就拥有更高的优先级。如 +
的优先级大于 <
,也就意味则 +
的优先级大于以 <
开头的 <<
,所以 2<<2+2
, 实际上等价于 2<<(2+2)
:
scala> 2<<2+2 res0: int = 32 scala> 2<<(2+2) res1: int = 32
3.5 对象相等性
如果想要判断两个对象是否相等,可以使用 ==
和 !=
,这两个操作符可以用于所有的对象,包括 null。
scala> 1==2 res2: boolean = false scala> list(1,2,3)==list(1,2,3) res3: boolean = true scala> 1==1.0 res4: boolean = true scala> list(1,2,3)==null res5: boolean = false scala> null==null res6: boolean = true
参考资料
- martin odersky . scala 编程 (第 3 版)[m] . 电子工业出版社 . 2018-1-1
更多大数据系列文章可以参见 github 开源项目: 大数据入门指南
下一篇: 一分钟了解Linux文件系统