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 开源项目: 大数据入门指南
Scala 系列(二)—— 基本数据类型和运算符的更多相关文章
- Java 第二章 变量、数据类型和运算符
第二章 变量.数据类型和运算符 什么是变量: 变量代表一块内存区域,变量类型不一样,这一块内存的大小也不一样. #在编程语言里面,你可以通过定义变量,向内存里添加数据或者修改内存已有的数据. ...
- PostgreSQL自学笔记:5 数据类型和运算符
5 数据类型和运算符 5.1 PostgreSQL 数据类型介绍 5.1.1 整数类型 整型类型 字节 取值范围 smallint 2字节 -2^15 ~ 2^15 int integer 4字节 - ...
- Java中的变量,数据类型和运算符
变量,数据类型和运算符 1.变量是一个数据存储空间的表示,它是储存数据的基本单元. 如何理解这句话,下面用一个表格可以形象的表达: 变量与房间之间的对应关系 房间名称 变量名 房间类型 变量类型 入住 ...
- IOS开发新手教程(一)-数据类型和运算符
OC语法入门(一) 数据类型和运算符 1.1凝视 凝视和其它语言一样,同意单行 ,多行凝视,一份规范的代码里面须要有一些正式的凝视,例如以下凝视: /* 这是多行 凝视 */ //这是多行凝视 OC语 ...
- Java1变量数据类型和运算符
day02_变量数据类型和运算符 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class jh_01_数据类型说明 { public ...
- 使用 JavaScript 中的变量、数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算符的不同位置得到不同的结果
查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的变量.数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算 ...
- 一:c语言(数据类型和运算符)
#include <stdio.h> /*就是一条预处理命令,它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作.*/ int main() /*C程序就是执行主函数 ...
- Scala 学习之路(二)—— 基本数据类型和运算符
一.数据类型 1.1 类型支持 Scala 拥有下表所示的数据类型,其中Byte.Short.Int.Long和Char类型统称为整数类型,整数类型加上Float和Double统称为数值类型.Scal ...
- JavaScript(二)---- 变量、数据类型和运算符
变量 javaScript中的变量变量是弱类型的,用var来声明. javascript的变量声明格式: var 变量名 = 数据; 声明变量要注意的事项: 1. 在javascript中声明变量是 ...
随机推荐
- .NET Core 3.0之深入源码理解HttpClientFactory(一)
写在前面 创建HttpClient实例的时候,在内部会创建HttpMessageHandler链,我们知道HttpMessageHandler是负责建立连接的抽象处理程序,所以HttpClient的维 ...
- JVM调优之探索CMS和G1的物理内存归还机制
前言: 公司有一个资产统计系统,使用频率很低,但是要求在使用时查询速度快,因此想到做一些缓存放在内存中,在长时间没有使用,持久化到磁盘中,并对垃圾进行回收,归还物理内存给操作系统,从而节省宝贵资源给其 ...
- 阿里百川HotFix2.0热修复初体验
博客原地址:http://blog.csdn.net/allan_bst/article/details/72904721 一.什么是热修复 热修复说白了就是"打补丁",比如你们公 ...
- 使用Kubeadm创建k8s集群之部署规划(三十)
前言 上一篇我们讲述了使用Kubectl管理k8s集群,那么接下来,我们将使用kubeadm来启动k8s集群. 部署k8s集群存在一定的挑战,尤其是部署高可用的k8s集群更是颇为复杂(后续会讲).因此 ...
- Python3发送邮件功能
Python3实现邮件发送功能 import smtplib from email.mime.text import MIMEText # 导入模块 class SendEmail: def send ...
- win7 python pdf2image入坑经历
Python开发菜鸟入坑 项目要求pdf转成图片,网上较多的方案对于windows极其不友好,wand,Pythonmagick(win下载地址:www.lfd.uci.edu/~gohlke/pyt ...
- Java模拟并解决缓存穿透
什么叫做缓存穿透 缓存穿透只会发生在高并发的时候,就是当有10000个并发进行查询数据的时候,我们一般都会先去redis里面查询进行数据,但是如果redis里面没有这个数据的时候,那么这10000个并 ...
- JavaScript数据结构——树的实现
在计算机科学中,树是一种十分重要的数据结构.树被描述为一种分层数据抽象模型,常用来描述数据间的层级关系和组织结构.树也是一种非顺序的数据结构.下图展示了树的定义: 在介绍如何用JavaScript实现 ...
- java多线程中wait/notify/sleep/join/yield方法以及多线程的六种状态
刚开始学线程的时候也是被这几个方法搞的云里雾里的,尤其是一开始看的毕老师的视频,老师一直在强调执行权和执行资格,看的有点懵逼,当然不是说毕老师讲的不好,就是自己有点没听明白,后来复习看了一些其他的博客 ...
- 史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式
1.概述 通过上篇史上最全面的SignalR系列教程-1.认识SignalR文章的介绍,我们对SignalR技术已经有了一个全面的了解.本篇开始就通过SignalR的典型应用的实现方式做介绍,例子虽然 ...